haskell - 组成两个折叠

标签 haskell haskell-lens

假设(来自镜头库)我有

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

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

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

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

最佳答案

看起来高效的实现方式很简单

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

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

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

我花了一些时间才明白为什么明显不对称的 *> 就足够了。

关于haskell - 组成两个折叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69329888/

相关文章:

haskell,使用 monads 的同一个程序

haskell - Pipes.Binary.decode - StateT 有什么用?

windows - Haskell Parsec 编译错误

haskell - Haskell 中的乘法列表

haskell - 如何在 Haskell 中将 Unicode 转义序列转换为 Unicode 字符串

haskell - 如何组合镜头(不是构图)

haskell - 如何将字段构造函数参数传递给函数?

haskell - 如何在镜头中使用过载的记录场?

haskell - 如何使用带有镜头的一元函数进行修改?

haskell - 使用镜头替换(键,值)列表的特定元素