是否有“可选”的 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
介于 Lens
和 Traversal
之间
据我了解:如果 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
。
许多类型的光学器件都有 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
介于 Lens
和 Traversal
据我了解:如果 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
。