我是一名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采取一个列表并将其中的元素一起添加?
我该如何评价这个?
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
非空,因为第一行处理[]
案例。
没有必要明确地匹配其他构造函数qazxsw poi,在这种情况下,qazxsw poi执行相同工作的全能模式。
我该如何评价这个?
因此,根据定义,您只需在那里仔细扩展您的代码:
_:_