如何对元组列表中的元组求和?
How to sum tuples in a list of tuples?
例如,我有以下列表:
example = [(5.4, 3.2), (2.4, 3.5), (2.4, 4.0), (5.1, 3.6)]
我想得到每个“()”元组的总和。这意味着我想将 5.4 与 3.2 相加,然后将 2.4 与 3.5 相加,依此类推。
结果应如下所示:
First: 8.6
Second: 5.9
Third: 6.4
Fourth: 8.7
我只能用一对来完成,但不知道如何从列表中获取每笔金额。
sumexample:: [(Double, Double)] -> [Double]
sumexample [(a, b)] = a + b
所以你写了
sumexample :: [(Double, Double)] -> [Double]
sumexample [(a, b)] = [ a + b ]
-- ^^^ ^^^ -- (error, corrected)
啊,太棒了!您已经拥有了解决它所需的一切。几乎。缺少的部分是附加运算符 ++
,可以通过附加其元素的单例列表来构建任意长度的列表:
[ 1, 2, 3, ... ] ===
[1] ++ [2] ++ [3] ++ ...
那么sumexampleList
应该遵循
的规律
sumexampleList :: [(Double, Double)] -> [Double]
sumexampleList [a , b , c , ... ] ===
sumexampleList ( [a] ++ [b] ++ [c] ++ ... ) ===
sumexample [a] ++ sumexample [b] ++ sumexample [c] ++ ... ===
sumexample [a] ++ sumexampleList [b, c, ... ]
-- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ --- right?
Haskell 不理解上述作为有效的定义语法。但它确实理解
[1, 2, 3, ...] ===
1 : [2, 3, ...]
所以我们可以用常规语法将上面的规律重写为
sumexampleList (a : bcde) =
sumexample a ++ sumexampleList bcde
那是 Haskell 中真正的递归函数定义。
但是缺少一种情况,列表为空的情况 []
.
您需要通过添加该附加方程来完成定义。
解决了这个问题后,sumexample :: [(Double, Double)] -> [Double]
是糟糕的设计:它只适用于单例,但类型是 list。所以完全去掉括号:
sumexample :: (Double, Double) -> Double
sumexample (a, b) = ....
并相应地修改递归定义。
例如,我有以下列表:
example = [(5.4, 3.2), (2.4, 3.5), (2.4, 4.0), (5.1, 3.6)]
我想得到每个“()”元组的总和。这意味着我想将 5.4 与 3.2 相加,然后将 2.4 与 3.5 相加,依此类推。
结果应如下所示:
First: 8.6
Second: 5.9
Third: 6.4
Fourth: 8.7
我只能用一对来完成,但不知道如何从列表中获取每笔金额。
sumexample:: [(Double, Double)] -> [Double]
sumexample [(a, b)] = a + b
所以你写了
sumexample :: [(Double, Double)] -> [Double]
sumexample [(a, b)] = [ a + b ]
-- ^^^ ^^^ -- (error, corrected)
啊,太棒了!您已经拥有了解决它所需的一切。几乎。缺少的部分是附加运算符 ++
,可以通过附加其元素的单例列表来构建任意长度的列表:
[ 1, 2, 3, ... ] ===
[1] ++ [2] ++ [3] ++ ...
那么sumexampleList
应该遵循
sumexampleList :: [(Double, Double)] -> [Double]
sumexampleList [a , b , c , ... ] ===
sumexampleList ( [a] ++ [b] ++ [c] ++ ... ) ===
sumexample [a] ++ sumexample [b] ++ sumexample [c] ++ ... ===
sumexample [a] ++ sumexampleList [b, c, ... ]
-- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ --- right?
Haskell 不理解上述作为有效的定义语法。但它确实理解
[1, 2, 3, ...] ===
1 : [2, 3, ...]
所以我们可以用常规语法将上面的规律重写为
sumexampleList (a : bcde) =
sumexample a ++ sumexampleList bcde
那是 Haskell 中真正的递归函数定义。
但是缺少一种情况,列表为空的情况 []
.
您需要通过添加该附加方程来完成定义。
解决了这个问题后,sumexample :: [(Double, Double)] -> [Double]
是糟糕的设计:它只适用于单例,但类型是 list。所以完全去掉括号:
sumexample :: (Double, Double) -> Double
sumexample (a, b) = ....
并相应地修改递归定义。