class Foldable t where
{-# MINIMAL foldMap | foldr #-}
foldMap :: Monoid m => (a -> m) -> t a -> m
foldMap f = foldr (mappend . f) mempty
foldr :: (a -> b -> b) -> b -> t a -> b
foldr f z t = appEndo (foldMap (Endo #. f) t) z
-- and a number of optional methods
Intuitively (though not technically), Foldable
structures are containers of elements a
which allow access to their elements in a well-defined order. The foldMap
operation maps each element of the container to a Monoid
and collapses them using the Monoid
structure.