繁体   English   中英

Haskell:如何用文件夹减去列表中的数字?

[英]Haskell: How to subtract numbers in a list with foldr?

当您使用文件夹在列表中添加数字时,它会起作用:

sumIntegers :: [Integer] -> Integer
sumIntegers xs = foldr (+) 0 xs

但是减法的工作方式不同,因为减号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

必须更改什么? 先感谢您

加法是关联的(并且是可交换的,这意味着标识是首先添加在右侧还是最后添加在左侧都无所谓),因此foldrfoldl计算相同的总和:

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

但是,减法不具有关联性。 (x - y) - z通常不等于x - (y - z) ,因此foldrfoldl计算两个不同的结果:

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

选择哪个函数取决于您实际要计算的运行差异。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM