Trình lập trình Haskell mới sẽ sớm đủ nguồn để xem cách foldr
được triển khai. Vâng, mã được sử dụng đơn giản (không mong đợi những người mới đến biết về OldList
hoặc FTP
).Giải thích cách foldr mới hoạt động trong Haskell
Mã mới hoạt động như thế nào?
-- | 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
Có lẽ không phải là một trùng lặp, nhưng [Tôi đã viết một câu trả lời về việc 'foldr' từ 'foldMap' một lúc trước] (http://stackoverflow.com/a/23319967/2751851). Câu trả lời cho thấy sự quen thuộc cơ bản với 'Monoid', vì vậy hãy cho chúng tôi biết nếu có quá nhiều thứ cho phép. – duplode