如何对元组列表中的元组求和?

随机伙计

例如,我有以下列表:

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) = ....

并相应地修改递归定义。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章