可折叠的定义
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
结构折叠它们。