如何组合Haskell Lens库中两个Fold实现toListOf结果拼接
解决方案
你需要的combine可以直接复用Fold类型自带的Monoid实例实现,最简单的写法如下:
combine :: Fold s a -> Fold s a -> Fold s a combine = (<>)
逻辑说明
Fold类型本身就实现了Monoid接口,其中<>运算符的原生语义就是按顺序组合两个同类型的Fold,遍历结果就是前一个Fold的结果拼接后一个Fold的结果,完全符合你给出的等价规则:
toListOf (fold1 <> fold2) s == toListOf fold1 s ++ toListOf fold2 s
这种实现是完全组合式的,不需要手动调用toListOf做列表拼接,直接复用了lens库内置的optic组合规则。
内容的提问来源于stack exchange,提问作者Louis Wasserman
相关产品推荐
相关产品推荐

