van Laarhoven是否表示“可选”


15

许多类型的光学元件都具有van Laarhoven表示。

例如,Lens类型的a Lens s t a b 可以表示为:

 Functor f => (a -> f b) -> s -> f t

类似地Traversal,可以用类似的方式表示,将Functor约束交换为Applicative

 Applicative f => (a -> f b) -> s -> f t

几种光学框架(例如MonocleArrow)定义了一种类型Optional

在《单片眼镜光学》中,层次结构 Optional介于Lens和之间Traversal

根据我的理解:如果Traversal是像一个Lens可能具有零到多个目标,那么Optional就像是一个Lens可能具有零到一的目标。

在Monocle中,Optional定义为一对功能:

getOrModify :: s -> Either t a 
set :: (b, s) -> t

Monocle源代码中的注释表明,也可以将“表示Optional为越来越PLensPPrism

是否可以将Optionalvan Laarhoven函数表示为?

Answers:


10

如果Functor / Applicative / Monad层次结构更细粒度,则将有一种表示方式。特别是:

class Functor f => Pointed f where
    pure :: a -> f a

type Optional s t a b = forall f. Pointed f => (a -> f b) -> s -> f t

请注意,Affine如果在类层次结构中巧妙地将其命名,则可以在镜头库中命名该类型。


1
这对于我的用例来说是完全方便的,这是一个“仅用于娱乐”的Scala光学库,我从头开始编写了Functor层次结构,因此可以使用它做任何我想做的事情。我是正确的思维,这表明,如果我也有之间的另一种类型的类FunctorApplicativeliftA2,但没有纯粹的,那么这将定义与视神经一对多目标?这有名字吗?

1
它确实表明了这一点。我不知道光学器件会被称为什么。
卡尔,

4
@Joe Apply在“ semigroupoids ”包中调用该中间类。hackage.haskell.org/package/semigroupoids-5.3.3/docs/…–
danidiaz

2
...并且lens包装中相应的光学元件称为Traversal1
Benjamin Hodgson

@Carl我们如何验证这type Optional s t a b确实是该光学器件的正确表示形式,以及所有适当的定律是否成立?这似乎是一个魔术。为什么会这样,Pointed而不是Copointed呢?对于另一个给定的光学元件,我们如何猜测正确的声像表示?
winitzki
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.