簡體   English   中英

如何對元組列表中的元組求和?

[英]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)

啊,太好了。 你已經擁有了解決它所需的一切。 幾乎。 缺少的部分是附加運算符++ ,可以通過附加其元素的 singleton 列表來構建任意長度的列表:

[  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 中真正的遞歸 function 定義。 但是缺少一種情況,即帶有空列表的情況[]

您將需要通過添加該附加方程來完成定義。


解決了這個問題后, sumexample:: [(Double, Double)] -> [Double]是糟糕的設計:它只適用於單例,但類型是list 所以完全去掉括號:

sumexample :: (Double, Double) -> Double
sumexample (a, b) = ....

並相應地修改遞歸定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM