簡體   English   中英

如何在 Haskell 中總結元組列表?

[英]How can I sum a list of tuples in Haskell?

這是一個超級簡單的問題,但我似乎找不到答案。 假設我在 Haskell 中有一個元組列表,

myList = [("foo", 2), ("bar", 4), ("foo", 6), ("bar", 1)]

我想按第一個元素對它們進行分組,然后在第二個元素上總結它們,我該怎么做?

此示例將輸出[("foo", 8), ("bar", 5)]

這在很大程度上取決於您的鍵(元組中的第一個元素)是Ord還是僅Eq 如果它僅在Eq ,那么基於partition的方法就可以了:

import Data.List (partition)

sumByKey :: (Eq k, Num v) => [(k, v)] -> [(k, v)]
sumByKey []         = []
sumByKey ((k,v):xs) = (k,v + sum vs) : sumByKey bs
  where
    vs       = map snd ks
    (ks, bs) = partition ((k ==) . fst) xs

但是,如果您手頭有Ord並且可以很好地處理外部依賴項,那么Map可以使代碼更容易:

import Data.Map.Strict

sumByKey :: (Ord k, Num v) => [(k, v)] -> [(k, v)]
sumByKey = toList . fromListWith (+)

暫無
暫無

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

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