Haskell Language Flattening a Foldable structure into a Monoid


foldMap maps each element of the Foldable structure to a Monoid, and then combines them into a single value.

foldMap and foldr can be defined in terms of one another, which means that instances of Foldable need only give a definition for one of them.

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

Example usage with the Product monoid:

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