【问题标题】:Evaluation order of a function makeSum in haskellhaskell中函数makeSum的求值顺序
【发布时间】:2018-01-03 08:39:06
【问题描述】:

我是 Haskell 新手,我正在查看评估顺序作为我大学讲座的一部分。我有一个我无法完全解决的例子。 我知道 Haskell 使用惰性评估并且它评估最外层,最左边。 在这种情况下,我认为这是我不理解的功能本身。

c) 使用 makeSum 和 foldr1 的以下定义,显示计算 makeSum [3, 2, 7] 的所有步骤。

makeSum [] = 0
makeSum xs = foldr1 add xs
where
add x y = x + y

foldr1 f [x] = x
foldr1 f (x:xs) = f x (foldr1 f xs)

我知道 foldr1 接受一个函数和一个列表,如果列表包含一个元素,则返回该元素,如果列表较长,则将该函数应用于第一个元素和其余元素。

makeSum 接受一个空列表并返回零,这就是我感到困惑的地方。如果它有一个需要一个空列表的情况,那么递归调用不应该是这样的:

makeSum (x:xs) = foldr1 add xs

而不是这样:

makeSum xs = foldr1 add xs

从我得到的 makeSum 获取一个列表并将其中的元素添加在一起?

我如何评价这个?

【问题讨论】:

    标签: haskell evaluation


    【解决方案1】:

    我如何评价这个?

    因此,您只需要根据定义仔细扩展您的代码即可:

    makeSum [3, 2, 7]               --initial definition
    foldr1 add [3, 2, 7]            --substitute with makeSum xs = foldr1 add xs, being xs = [3,2,7]
    add 3 (foldr1 add [2, 7])       --foldr1 f (x:xs) = f x (foldr1 f xs) being f = add and xs = [2,3,7]
    add 3 (add 2 (foldr1 add [7]))  --keep the recursive work
    add 3 (add 2 (7))
    3 + ((2 + 7)
    3 + 9
    12                              --final result
    

    【讨论】:

      【解决方案2】:
      makeSum [] = 0
      makeSum xs = foldr1 add xs
         where
         add x y = x + y
      

      相当于OP的替代品

      makeSum [] = 0
      makeSum (x:xs) = foldr1 add (x:xs)
         where
         add x y = x + y
      

      重点是:在第一个sn-p中,变量xs会被绑定到整个列表中。此外,xs 不为空,因为第一行处理 [] 的情况。

      无需显式匹配另一个构造函数_:_,在这种情况下,xs 的包罗万象的模式可以完成相同的工作。

      【讨论】:

      • 好的,明白了!非常感谢,我很难理解为什么我们只能使用 xs。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-08
      • 1970-01-01
      • 2011-02-25
      相关资源
      最近更新 更多