scala - 是否有 `Optional` 的 van Laarhoven 表示

标签 scala haskell functional-programming lenses monocle-scala

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

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

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

类似的 Traversal ,可以用类似的方式表示,交换 Functor Applicative 的约束:
 Applicative f => (a -> f b) -> s -> f t

几种光学框架,如MonocleArrow定义一个名为 Optional 的类型.

In Monocle's Optics heirarchy Optional适合 LensTraversal
据我了解:如果 Traversal就像 Lens可能有零到多个目标,然后是 Optional就像 Lens可能有零到一的目标。

在单片眼镜中,Optional定义为一对函数:
getOrModify :: s -> Either t a 
set :: (b, s) -> t

Comments in the Monocle source code建议也可以表示 Optional “作为较弱的 PLens 和较弱的 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

请注意,该类型可能会被命名为 Affine如果在类层次结构中整齐的话,在镜头库中。

关于scala - 是否有 `Optional` 的 van Laarhoven 表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58583458/

相关文章:

javascript - 从没有数组的函数链中提取数据

java - 哪些语言支持 Lenses 或类似的方式来更新不可变的嵌套结构?

scala - 附加可选元素列表

haskell - 你如何在 Haskell 中进行泛型编程?

Haskell GHC-7.6.2 使用 HashMap 导出数据和类型

javascript - 简化分页页面列表的生成

c++ - 功能/不可变数据结构在非垃圾收集上下文中是否仍然对并发有用?

scala - 如何在使用 SBT 打包期间而不是在测试期间排除资源

Scala Try/Future,在失败时包装异常

haskell - Data.Text.Lazy.Internal.Text 到 Data.Text.Text