Haskell Foldr1 lambda 函数添加元组值

问题描述 投票:0回答:2

我一直在挠头试图弄清楚这一点。我如何使用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 一起解决了这个问题,并且得到了正确的答案)?

list haskell functional-programming tuples fold
2个回答
1
投票

foldr1 :: (a -> a -> a) -> [a] -> a
表示折叠结果与列表元素类型相同时。由于您的结果是一个数字,而列表元素是元组,因此这里的函数不正确。
foldr
可能是正确的:

foldr (\x y -> fst(x) + snd(x) + y) 0 [(1,2),(3,4)]

0
投票

您不能使用

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)]
© www.soinside.com 2019 - 2024. All rights reserved.