`Optional`是否有van Laarhoven表示法?

16
许多类型的光学都有van Laarhoven表示法。
例如,类型为的Lens可以表示为:
 Functor f => (a -> f b) -> s -> f t

同样地,一个 Traversal 可以用类似的方式表示,只需将 Functor 约束替换为 Applicative

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

几个光学框架,比如 MonocleArrow 都定义了一个叫做 Optional 的类型。

在 Monocle 的光学层次结构中Optional 位于 LensTraversal 之间。

我的理解是:如果一个 Traversal 类似于一个可以有零到多个目标的 Lens ,那么一个 Optional 就像是一个可以有零到一个目标的 Lens

在 Monocle 中,Optional 被定义为一对函数:

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

Monocle源代码中的注释表明,将Optional表示为“较弱的PLens和较弱的PPrism”也是可能的。

能否将Optional表示为van Laarhoven函数?

1个回答

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
这对于我的使用情况非常方便,我编写了一个“just for fun”的Scala Optics库,并从头开始编写了Functor层次结构,因此可以随心所欲地使用它。我是否正确地认为这表明,如果我在FunctorApplicative之间还有另一个类型类,具有liftA2但没有pure,那么这将定义具有一个到多个目标的光学? 这有一个名称吗? - Joe
1
它确实暗示了这一点。我不知道光学器件应该叫什么。 - Carl
4
@Joe,"semigroupoids"包中的那个中间类被称为Apply。http://hackage.haskell.org/package/semigroupoids-5.3.3/docs/Data-Functor-Apply.html#t:Apply - danidiaz
2
...对应的光学操作在lens包中被称为Traversal1 - Benjamin Hodgson
2
如果您手写一堆van Laarhoven镜头和遍历器(非常推荐-它们不是魔法),您最终会掌握操作如何对应于数据结构中存在的目标数量。fmap处理具有单个目标的结构。pure处理没有目标的结构。(<*>)组合每个已处理目标的子结构。从这里,您可以观察到仅使用fmappure将让您处理0或1个目标,但不超过1个。那就是Pointed - Carl
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接