haskell中函数makeSum的求值顺序

时间:2018-01-03 08:39:07

标签: haskell evaluation

我是一名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获取一个列表并将其中的元素一起添加?

我如何评价这个?

2 个答案:

答案 0 :(得分:3)

  

我如何评价这个?

因此,根据定义,您只需在那里仔细扩展您的代码:

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

答案 1 :(得分:1)

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

重点是:在第一个代码段中,变量xs将绑定整个列表。此外,xs非空,因为第一行处理[]案例。

没有必要明确地匹配其他构造函数_:_,在这种情况下,作为xs的全能模式执行相同的工作。