如何用内置Lens运算符简化含_Just的透镜链式调用?
简化Lens嵌套
_Just访问的方案 标准lens库没有内置你设想的©运算符,但完全可以自己定义一个来实现需求。
你要的核心是把每个透镜自动拼接._Just的组合逻辑,我们可以写出这样的自定义运算符:
import Control.Lens -- 针对Getting类型的简化版本 (©) :: Getting (First a) s (Maybe b) -> Getting (First a) b (Maybe c) -> Getting (First a) s (Maybe c) l1 © l2 = l1 . _Just . l2 -- 更通用的Applicative版本,适配更多场景 (©) :: Applicative f => (s -> f (Maybe a)) -> (a -> f (Maybe b)) -> s -> f (Maybe b) l1 © l2 = l1 . traverse l2
定义后就能按你想要的方式写:
foo ^? lens1 © lens2 © lens3
这个运算符本质是把重复的._Just逻辑封装起来,标准库虽没提供,但这种自定义封装非常直观。
如果不想自定义运算符,也可以用traverse替代_Just来简化写法:
foo ^? lens1 . traverse . lens2 . traverse . lens3
处理Maybe类型时,traverse和_Just的效果完全一致,写法上比重复._Just清爽不少。
内容的提问来源于stack exchange,提问作者majkrzak
相关产品推荐
相关产品推荐

