haskell 中函数 makeSum 的求值顺序
Evaluation order of a function makeSum in haskell
我是 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 接受一个函数和一个列表,如果列表包含一个元素,它 returns 元素,如果列表更长,它将函数应用于第一个和其余元素。
makeSum 采用空列表,returns 为零,这是我感到困惑的地方。如果它有一个空列表的情况,递归调用不应该是这样的:
makeSum (x:xs) = foldr1 add xs
而不是这个:
makeSum xs = foldr1 add xs
从我得到的 makeSum 获取一个列表并将其中的元素加在一起?
我如何评价这个?
How do i evaluate this?
因此,根据定义,您只需要在此处仔细扩展代码:
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
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
的包罗万象的模式可以完成相同的工作。
我是 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 接受一个函数和一个列表,如果列表包含一个元素,它 returns 元素,如果列表更长,它将函数应用于第一个和其余元素。
makeSum 采用空列表,returns 为零,这是我感到困惑的地方。如果它有一个空列表的情况,递归调用不应该是这样的:
makeSum (x:xs) = foldr1 add xs
而不是这个:
makeSum xs = foldr1 add xs
从我得到的 makeSum 获取一个列表并将其中的元素加在一起?
我如何评价这个?
How do i evaluate this?
因此,根据定义,您只需要在此处仔细扩展代码:
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
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
的包罗万象的模式可以完成相同的工作。