可折叠的定义

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 结构折叠它们。