【发布时间】:2018-02-13 07:06:56
【问题描述】:
我对 foldr 和 foldl 的工作原理感到非常困惑。例如在列表 [1,2,3] 上使用这样的方法
foldr (+) 0 => 1 : (2 :(3:([]))
=> 1 + (2 +(3+0)) = 6
这是有道理的,因为每个 : 都被 + 号替换,空集被 0 替换。
但是当我在 ghci 中输入以下两行时,我得到:
foldr div 7 [13,6,19] -- gives me 4
foldl div 7 [13,6,19] -- gives me 0
我以为我会得到一个列表,其中每个元素都除以 7,但我只得到一个元素。 有人可以告诉我ghci是如何计算的吗?
【问题讨论】:
-
不,如果你想
div每个元素,你需要map (`div` 7) [13, 6, 19] -
foldr div 7 [13, 6, 19]表示您计算div 13 (div 6 (div 19 7)) == div 13 (div 6 2) == div 13 3 == 4,对于foldl则相反:div (div (div 7 13) 6) 19 == div (div 0 6) 19 == div 0 19 == 0。 -
另外,
div是整数除法,所以它向下取整(你可以用rem得到余数)。您的foldl示例将 7/13 向下舍入为 0,然后 0/6 和 0/19 为零。您的foldr示例将 19/7 舍入为 2,然后 6/2 为 3,13/3 舍入为 4。 -
请注意,在第一个示例中,您没有得到一个列表,其中每个元素都与
0相加。
标签: haskell