如果后者与幺半群没有任何关系,那么foldMap如何与foldr一样?

The*_*Cat 7 haskell fold monoids

foldr并且foldMap可以用于我理解的彼此定义.但这怎么可能,因为后者使用幺半群,而前者不是?我们是否有任何保证foldr作品上的东西可以有一个幺半群?

n. *_* m. 7

foldr :: (a -> b -> b) -> b -> [a] -> b
Run Code Online (Sandbox Code Playgroud)

需要注意的是a -> b -> ba -> (b -> b).函数b -> b在组合下形成一个幺半群.

请注意这是如何相似的

foldMap :: (..omitted..) => (a -> m) -> f a -> m
Run Code Online (Sandbox Code Playgroud)

唯一的区别是,foldMap不使用类型的"零"的说法bfold,并返回一个m,这方面的foldrb->b.现在只需将一个应用到另一个,你就可以foldr从中恢复过来foldMap.