You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用内置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:12:39