【问题标题】:How can foldMap do the same as foldr when the latter does not have anything to do with monoids?当 foldr 与幺半群没有任何关系时, foldMap 怎么能和 foldr 一样呢?
【发布时间】:2016-05-29 17:57:16
【问题描述】:

foldr 和foldMap 据我了解可以用来定义彼此。但这怎么可能,因为后者使用幺半群,而前者却没有?我们能保证foldr 工作的东西可以有一个幺半群吗?

【问题讨论】:

标签: haskell fold monoids


【解决方案1】:
foldr :: (a -> b -> b) -> b -> [a] -> b

请注意,a -> b -> b 是 a -> (b -> b)。函数b -> b 在合成下形成一个幺半群。

注意它的相似之处

foldMap :: (..omitted..) => (a -> m) -> f a -> m

唯一的区别是 foldMap 不使用 fold 的 b 类型的“零”参数,而是返回一个 m,就 foldr 而言将是 b->b。现在只需将一个应用到另一个,您就已经从 foldMap 恢复了 foldr。

【讨论】:

  • 感谢您纠正错字;)
猜你喜欢
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 2018-10-05
  • 1970-01-01
相关资源
最近更新 更多