【发布时间】:2015-08-08 16:33:08
【问题描述】:
新的 Haskell 程序员很快就会去源头看看 foldr 是如何实现的。好吧,以前的代码很简单(不要指望新手知道OldList 或FTP)。
新代码是如何工作的?
-- | Map each element of the structure to a monoid,
-- and combine the results.
foldMap :: Monoid m => (a -> m) -> t a -> m
foldMap f = foldr (mappend . f) mempty
-- | Right-associative fold of a structure.
--
-- @'foldr' f z = 'Prelude.foldr' f z . 'toList'@
foldr :: (a -> b -> b) -> b -> t a -> b
foldr f z t = appEndo (foldMap (Endo #. f) t) z
【问题讨论】:
-
可能不是重复的,而是I wrote an answer on getting
foldrfromfoldMapa while ago。答案假定您对Monoid基本熟悉,所以请告诉我们是否认为有太多事情是理所当然的。
标签: haskell