是否有“可选”的 van Laarhoven 表示

Is there a van Laarhoven representation of `Optional`

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

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

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

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

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

几个光学框架,例如 Monocle and Arrow 定义了一个名为 Optional 的类型。

In Monocle's Optics heirarchy Optional 介于 LensTraversal

之间

据我了解:如果 Traversal 类似于 Lens,可能有 零到多个 个目标,那么 Optional就像一个 Lens 可能有 零到一个 目标。

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

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

Comments in the Monocle source code 建议也可以表示一个 Optional "as a weaker PLens and weaker PPrism"

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

如果 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

请注意,如果该类型在 class 层次结构中整齐地排列,则该类型可能会在镜头库中命名为 Affine