【发布时间】: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