将可折叠结构展平为 Monoid

foldMap 将可折叠结构的每个元素映射到 Monoid ,然后将它们组合成单个值。

foldMapfoldr 可以相互定义,这意味着 Foldable 的实例只需要给出其中一个的定义。

class Foldable t where
    foldMap::Monoid m => (a -> m) -> t a -> m
    foldMap f = foldr (mappend . f) mempty

使用 Product monoid 的示例 :

product :: (Num n, Foldable t) => t n -> n
product = getProduct . foldMap Product