我有一个数据对象,我按如下方式访问它。
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/