16

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

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

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

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

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

一些光学框架,例如MonocleArrow定义了一个名为Optional.

在 Monocle 的光学层次结构 Optional中,介于LensTraversal

据我了解:如果 aTraversal就像 aLens可能有零到多个目标,那么 anOptional就像 aLens可能有零到一个目标。

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

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

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

是否可以将 an 表示Optional为 van Laarhoven 函数?

4

1 回答 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请注意,如果该类型在类层次结构中整齐地命名,则该类型可能会在镜头库中命名。

于 2019-10-27T21:59:32.750 回答