haskell - _Just 镜头链接的简写

标签 haskell haskell-lens

我有一个数据对象,我按如下方式访问它。

foo ^? lens1 . _Just . lens2 . _Just . lens3 . _Just

是否有一些内置镜头运算符(operator)可以像下面这样人手不足?

foo ^? lens1 © lens2 © lens3

最佳答案

它可能不在镜头中,但您可以轻松定义自己的运算符来插入 _Just在两个光学器件之间:

infixl 9 .?.
(.?.) :: Traversal' s (Maybe t) -> Traversal' t u -> Traversal' s u
s .?. t = s . _Just . t

哪里Traversal'Lens' 的最小公共(public)父类(super class)型和Prism'可以用透镜来表达(有一个更精确的变体,带有量角透镜)。或者这是一个更通用的签名:

(.?.) :: (Choice p, Applicative f) => Optic' p f s (Maybe t) -> Optic' p f t u -> Optic' p f s u

请注意(.?.)仅插入_Just在中间;您仍然需要将其附加在末尾:

foo ^? lens1 .?. lens2 .?. lens3 . _Just

关于haskell - _Just 镜头链接的简写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75602244/

相关文章:

haskell - 带镜头和 zipper 的遍历树

haskell - Haskell 中的电话簿

list - 将三个列表组合成 Haskell 中的三元组列表

performance - 如何重构这个 Haskell 随机字节输出器?

haskell - 在 Haste 中,是否可以使用 RPC 从服务器调用客户端代码?

haskell - 镜头变焦模糊变量

debugging - 让 "trace"像 "assert"一样优化?

haskell - 自动生成镜头中的类型类的文档在哪里?

Haskell 光学器件 : Setter for several lists

haskell - 在没有 Monoid 实例的情况下,如何处理 Control.Lens.Indexed 中 at 的 Maybe 结果