我一直在挠头试图弄清楚这一点。我如何使用foldr1(或任何其他折叠)来获得列表中元组的总和。
示例:
list = [(1,2), (3,4)]
sum = 10
我已经尝试过
foldr1 (\x y -> fst(x) + snd(x) + y) [(1,2),(3,4)]
,但它不起作用,我怀疑它与执行折叠时创建的类型而不是元组有关。
当我运行上述命令时,我得到:
foldr1 (\x y -> fst(x) + snd(x) + y) [(1,2),(3,4)]
• Occurs check: cannot construct the infinite type: a ~ (a, a)
• In the second argument of ‘(+)’, namely ‘y’
In the expression: fst (x) + snd (x) + y
In the first argument of ‘foldr1’, namely
‘(\ x y -> fst (x) + snd (x) + y)’
• Relevant bindings include
y :: (a, a) (bound at <interactive>:30:12)
x :: (a, a) (bound at <interactive>:30:10)
it :: (a, a) (bound at <interactive>:30:1)
我做错了什么?折叠函数不适合这个吗(我已经使用 sum 和 map 一起解决了这个问题,并且得到了正确的答案)?
foldr1 :: (a -> a -> a) -> [a] -> a
表示折叠结果与列表元素类型相同时。由于您的结果是一个数字,而列表元素是元组,因此这里的函数不正确。 foldr
可能是正确的:
foldr (\x y -> fst(x) + snd(x) + y) 0 [(1,2),(3,4)]
您不能使用
foldr1
,因为第一项是 2 元组,所以 y
也将是 2 元组。
您可以使用
foldr
代替:
foldr (\x y -> fst(x) + snd(x) + y) 0 [(1,2),(3,4)]
或更简单:
foldr (\(x1, x2) y -> x1 + x2 + y) 0 [(1,2),(3,4)]