foldr
和foldMap
可以用来定义彼此,据我所知。但是这怎么可能,因为后者使用幺半群,而前者不使用呢?我们能保证foldr
工作的东西可以有一个幺半群吗?
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
。