在Haskell的维基教科书,如下foldr相似被实现。但据我所知,acc是操作的标识值(例如0表示总和或1表示产品),其值在执行函数期间不会改变。那么为什么它在这里和其他文本中被称为累加器,这意味着它会逐步改变或累积一个值?累加器在foldr相似
我可以看到一个累加器在左边折叠中是相关的,比如foldl,但是wikibook解释是不正确的,只是对称性,在这种情况下它是错误的?
在Haskell的维基教科书,如下foldr相似被实现。但据我所知,acc是操作的标识值(例如0表示总和或1表示产品),其值在执行函数期间不会改变。那么为什么它在这里和其他文本中被称为累加器,这意味着它会逐步改变或累积一个值?累加器在foldr相似
我可以看到一个累加器在左边折叠中是相关的,比如foldl,但是wikibook解释是不正确的,只是对称性,在这种情况下它是错误的?
考虑您提供基于(正确的)定义一个简单的foldr
表达的评价:
foldr (+) 0 [1,2,3,4]
= 1 + foldr (+) 0 [2,3,4]
= 1 + 2 + foldr (+) 0 [3,4]
= 1 + 2 + 3 + foldr (+) 0 [4]
= 1 + 2 + 3 + 4 + foldr (+) 0 []
= 1 + 2 + 3 + 4 + 0
= 10
所以,你是对的:acc
并没有真正“积累”任何东西。它永远不会超过0
以外的值。
为什么它称为“acc”,如果它不是累加器?与foldl
相似? Hysterical raisins? A lie to children?我不确定。
编辑:我还要指出,foldr
的GHC实现使用z
(推测为零)而不是acc
。
那么,它的累加器不会改变:P – alternative 2014-11-22 13:43:13
acc
在foldr
的情况下没有真正积累任何东西,正如已经指出的那样。
我想补充说,没有它,目前还不清楚当输入是一个空列表时应该发生什么。
它也改变了f
的类型签名,限制了可以使用的功能。
E.g:
foldr' :: (a -> a -> a) -> [a] -> a
foldr' f [] = error "empty list???"
foldr' f (x:[]) = x
foldr' f (x:xs) = f x (foldr' f xs)
你描述的是'foldr1',它确实在空列表上出现错误。 – 2014-11-23 15:56:34
积累与foldl从foldr相似左侧和积累情况从右侧发生。 – 2014-11-22 04:44:34
是的,这很有趣。将'f'的第二个参数称为累加器可能更合适。我通常使用'z'(connoting zero)或'nil'(包含它所对应的构造函数)编写foldr-esque模式。 – luqui 2014-11-22 04:46:23