当 foldr 与幺半群没有任何关系时,foldMap 如何与 foldr 做同样的事情?

How can foldMap do the same as foldr when the latter does not have anything to do with monoids?

foldr and foldMap可以用我的理解互相定义。但这怎么可能,因为后者使用幺半群,而前者没有?我们能保证 foldr 处理的东西可以有一个幺半群吗?

foldr :: (a -> b -> b) -> b -> [a] -> b

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

请注意这有何相似之处

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

唯一的区别是 foldMap 不使用 fold 和 returns 和 m 类型 b 的 "zero" 参数,这在foldr 的条款将是 b->b。现在只需将一个应用到另一个,您就可以从 foldMap.

恢复 foldr