首页 > 解决方案 > 组成两个折叠

问题描述

假设(来自镜头库)我有

fold1 :: Fold s a
fold2 :: Fold s a

我想以这样的方式结合这些

toListOf (combine fold1 fold2) s == toListOf fold1 s ++ toListOf fold2 s

什么是最简单的实现combine?(当然可以根据 toListOf 等手动实现它,但我怀疑存在更纯粹的组合实现。)

标签: haskellhaskell-lens

解决方案


似乎有效的实现很简单

combine f1 f2 k s = f1 k s *> f2 k s

尽管也可以通过ReifiedFold, 尽管这似乎使用了效率可能较低的toListOf实现:

combine f1 f2 = runFold (Fold f1 <> Fold f2)

我花了一些时间来理解为什么明显不对称就*>足够了。


推荐阅读