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

如何从Lens列表生成Traversal以批量应用相同修改操作

方案1:直接折叠Lens列表

不需要自定义新运算符,用基础高阶函数即可实现:

s' :: S a
s' = foldl (&) s $ map (%~ f) ls

如果要实现你期望的???运算符,也可以自行定义:

infixl 1 %~~
(%~~) :: [Lens' s a] -> (a -> a) -> s -> s
ls %~~ f = \s -> foldl (&) s $ map (%~ f) ls

-- 调用方式和你预期的完全一致
s' = s & ls %~~ f

方案2:合并为Traversal直接操作

你的猜测完全正确,Lens本身可以隐式转换为Traversal,而Traversal类型是Monoid实例,直接用mconcat合并列表即可得到覆盖所有Lens焦点的Traversal,之后直接用标准的(%~)运算符操作即可:

import Control.Lens

s' :: S a
s' = s & mconcat ls %~ f

这种写法更符合lens库的设计习惯,代码也更简洁。

内容的提问来源于stack exchange,提问作者Dominik Schrempf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:06:02