haskell - 组成两个折叠
问题描述
假设(来自镜头库)我有
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)
我花了一些时间来理解为什么明显不对称就*>
足够了。
推荐阅读
- php - Laravel Mail - 无法将 G Suite 帐户用于 SMTP(已创建 2FA 和应用密码)
- html - 没有重叠项目的flexbox列换行列表
- python - 使用 ctypes 检索窗口标题
- python - 我想导入 Dictionary 但有问题
- pandas - 我想创建一个新列'Assign'并分配值:前缀'Check'列值和后缀为'-SPLIT'到ITEM_TYPE。EX.'TRUE-AB-SPLIT'
- node.js - NodeJS 服务器:如何在 JSON POST 中保留 int 元组数据而不将 int 转换为科学计数法?
- c++ - 字符串类的比较函数未按预期工作
- java - 找到多个 Bean - 只需要一个
- ubuntu - 如何在 Odoo 13 中指定自定义插件目录?
- angular - 如何仅在单击确认模式按钮时更改复选框状态