foldMap maps each element of the Foldable structure to a
Monoid, and then combines them into a single value.
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 :: (Num n, Foldable t) => t n -> n product = getProduct . foldMap Product