【问题标题】:foldr and foldl function applied on div function in Haskell应用于 Haskell 中的 div 函数的 foldr 和 foldl 函数
【发布时间】: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


【解决方案1】:

foldr 看起来像这样:

foldr f z [x1, x2, ..., xn] == x1 `f` (x2 `f` ... (xn `f` z)...)

所以在你的情况下:

foldr div 7 [13, 6, 19] == 13 `div` (6 `div` (19 `div` 7))

你可以在Hoogle 上看到这样的东西!如果您想要一个所有数字除以 7 的列表,请使用 map

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 2016-11-05
    • 2021-06-05
    • 2018-08-16
    • 1970-01-01
    相关资源
    最近更新 更多