【发布时间】:2014-11-22 04:37:55
【问题描述】:
在 Haskell Wikibook 中,foldr 的实现如下:
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr f acc [] = acc
foldr f acc (x:xs) = f x (foldr f acc xs)
表示将累加器的初始值设置为参数。但据我了解, acc 是操作的标识值(例如 sum 为 0 或 product 为 1),其值在函数执行期间不会改变。那么为什么在这里和其他文本中都将它称为累加器,暗示它逐步改变或累积一个值?
我可以看到累加器与左折叠相关,例如 foldl,但 wikibook 的解释是否不正确,仅出于对称性,在这种情况下是错误的?
【问题讨论】:
-
foldl 中的累积从左侧发生,foldr 中的累积从右侧发生。
-
是的,这很有趣。将
f的第二个参数称为累加器可能更合适。我通常用z(表示零)或nil(表示它对应的构造函数大小写)来编写foldr-esque模式。
标签: haskell