可摺疊的定義
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
直觀地(雖然不是技術上),Foldable 結構是元素 a 的容器,允許以明確定義的順序訪問它們的元素。foldMap 操作將容器的每個元素對映到 Monoid 並使用 Monoid 結構摺疊它們。