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

时间:2018-11-30 18:43:50

标签: haskell

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

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

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

必须更改什么? 预先谢谢你

1 个答案:

答案 0 :(得分:4)

加法是关联的(并且是可交换的,这意味着标识是在右边的第一个添加还是在左边的最后一个添加都没有关系),因此<div class="one_third"> <div class="boxes"> Hi there! </div> </div> <div class="one_third"> <div class="boxes"> Hi there! </div> </div> <div class="one_third"> <div class="boxes"> Hi there! </div> </div> 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 通常不等于(x - y) - z,因此x - (y - z)foldr计算两个不同的结果:

foldl

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