据我所知, foldr
和 foldMap
可用于彼此定义。但是这怎么可能呢,因为后者使用了类人动物,而前者却没有?我们是否可以保证foldr
所处理的内容可以具有monoid?
最佳答案
foldr :: (a -> b -> b) -> b -> [a] -> b
注意
a -> b -> b
是a -> (b -> b)
。函数b -> b
在组合下形成一个monoid。请注意这是如何
foldMap :: (..omitted..) => (a -> m) -> f a -> m
唯一的区别是foldMap不使用
b
的fold
类型的“零”参数,而是返回一个m
,就foldr
而言,它就是b->b
。现在,将一个应用到另一个,您已经从foldr
中恢复了foldMap
。关于haskell - 当foldr与monoid没有任何关系时,foldMap如何与foldr相同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37513123/