当您使用文件夹在列表中添加数字时,它会起作用:
sumIntegers :: [Integer] -> Integer
sumIntegers xs = foldr (+) 0 xs
Run Code Online (Sandbox Code Playgroud)
但是减法的工作方式不同,因为减号minus =加号。[2,3,4,5]就像:2-3 + 4-5。
subtractNums' :: Num a => [a] -> a
subtractNums' xs = foldr (-) 0 xs
subtractNums :: Num a => [a] -> a
subtractNums [] = 0
subtractNums (x:xs) = x - subtractNums xs
Run Code Online (Sandbox Code Playgroud)
必须更改什么?先感谢您
除了是联想(和可交换的,这意味着它并不重要,如果身份被先加入的权利,或最后在左边),所以无论foldr和foldl计算相同的总和:
foldr (+) 0 [1,2,3] == 1 + (2 + (3 + 0)) == 1 + 2 + 3 == 6
foldl (+) 0 [1,2,3] == ((0 + 1) + 2) + 3 == 1 + 2 + 3 == 6
Run Code Online (Sandbox Code Playgroud)
但是,减法不具有关联性。(x - y) - z通常不等于x - (y - z),因此foldr,foldl计算两个不同的结果:
foldl (-) 0 [1,2,3] == ((0 - 1) - 2) - 3
== (-1 - 2) - 3
== -3 - 3
== -6
foldr (-) 0 [1,2,3] == 1 - (2 - (3 - 0))
== 1 - (2 - 3)
== 1 - -1
== 2
Run Code Online (Sandbox Code Playgroud)
选择哪个函数取决于您实际要计算的运行差异。