可摺疊的定義

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 結構摺疊它們。