许多类型的光学都有van Laarhoven表示法。
例如,类型为的
例如,类型为的
Lens
可以表示为: Functor f => (a -> f b) -> s -> f t
同样地,一个 Traversal
可以用类似的方式表示,只需将 Functor
约束替换为 Applicative
:
Applicative f => (a -> f b) -> s -> f t
几个光学框架,比如 Monocle 和 Arrow 都定义了一个叫做 Optional
的类型。
在 Monocle 的光学层次结构中,Optional
位于 Lens
和 Traversal
之间。
我的理解是:如果一个 Traversal
类似于一个可以有零到多个目标的 Lens
,那么一个 Optional
就像是一个可以有零到一个目标的 Lens
。
在 Monocle 中,Optional
被定义为一对函数:
getOrModify :: s -> Either t a
set :: (b, s) -> t
Monocle源代码中的注释表明,将Optional
表示为“较弱的PLens
和较弱的PPrism
”也是可能的。
能否将Optional
表示为van Laarhoven函数?
Functor
和Applicative
之间还有另一个类型类,具有liftA2
但没有pure
,那么这将定义具有一个到多个目标的光学? 这有一个名称吗? - JoeApply
。http://hackage.haskell.org/package/semigroupoids-5.3.3/docs/Data-Functor-Apply.html#t:Apply - danidiazlens
包中被称为Traversal1
。 - Benjamin Hodgsonfmap
处理具有单个目标的结构。pure
处理没有目标的结构。(<*>)
组合每个已处理目标的子结构。从这里,您可以观察到仅使用fmap
和pure
将让您处理0或1个目标,但不超过1个。那就是Pointed
。 - Carl