如何从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
相关产品推荐
相关产品推荐

