Is there a van Laarhoven representation of `Optional`

Joe*_*Joe 15 haskell functional-programming scala lenses monocle-scala

Many types of optics have a van Laarhoven representation.

For example, a Lens of type Lens s t a b can be represented as:

 Functor f => (a -> f b) -> s -> f t
Run Code Online (Sandbox Code Playgroud)

Similarly a Traversal, can be represented in a similar way, swapping the Functor constraint for Applicative:

 Applicative f => (a -> f b) -> s -> f t
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

getOrModify :: s -> Either t a 
set :: (b, s) -> t
Run Code Online (Sandbox Code Playgroud)

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

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

Car*_*arl 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
Run Code Online (Sandbox Code Playgroud)

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

  • @Joe该中间类在“ semigroupoids”包中称为“ Apply”。http://hackage.haskell.org/package/semigroupoids-5.3.3/docs/Data-Functor-Apply.html#t:Apply (4认同)
  • ...,并且“ lens”包中的相应光学元件称为[`Traversal1`](http://hackage.haskell.org/package/lens-4.18.1/docs/Control-Lens-Traversal.html#t :Traversal1) (2认同)
  • @winitzki如果你手工编写一堆van Laarhoven镜头和遍历(强烈推荐 - 它们不是魔术),你最终会掌握操作如何与数据结构中存在的目标数量相对应。`fmap` 处理具有单个目标的结构。`pure` 处理没有目标的结构。`(<*>)` 组合了每个处理目标的子结构。由此你可以观察到,只有“fmap”和“pure”的东西可以让你处理 0 或 1 个目标,但不能超过 1 个。这就是“Pointed”。 (2认同)