2012-04-16 50 views
0

我已經得到另一個列表中的元組列表,並且在找到平均值時遇到問題。Haskell - 一起添加列表中的元組?

我檢查了問題和互聯網,但大多數時間他們不包括將所有的元組添加到一起和潛水。

我的目錄列表元組是[(String, Int)],我希望能夠找到的所有元組的平均值。

+0

什麼平均?元組內的整數? – 2012-04-16 21:56:07

+0

對不起,我應該更清楚。 – JamieB 2012-04-16 21:56:25

+0

您是否在意效率? – 2012-04-16 22:01:06

回答

0

如果你搜索網,你會發現許多average :: (Real a, Fractional b) => [a] -> b功能,e.g. here

所以,你只需要[(String, Int)] -> [Int]類型的函數,那麼你可以把兩者結合起來。

4

您可以很容易地將其轉換爲map snd的簡單整數列表。所以基本上,sum $ map snd listOfTuples將它們加在一起。 (爲了有效地計算平均,你可能想要做的東西多一點複雜的,但這應該把你在正確的軌道上。)

+2

這個暗示指向瞭解決這類問題的慣用Haskell風格。你也可以通過使用遞歸輔助函數或者使用foldl來解決它(可能更高效?),但這兩種方法都比較長,可以說不那麼清晰,並且不太習慣...... – comingstorm 2012-04-17 00:28:33

0

下面就來計算的單程之和長度的方法。

它不漂亮,但它的工作原理。

averageTuples ts = let results = calculateSum ts 
    in (fst results)/(snd results) 

calculateSum ts = foldr acc (0,0) $ zip (map snd ts) (repeat 1) where 
    acc (x, y) (x', y') = (x+x', y+y') 

main = print $ averageTuples [("foo", 1.09), ("bar", 2.6789), ("baz", 3.4)] 

請記住,您可能需要使用fromIntegral如果你把所有的INTS

1

而且列表,給出的形式[(String,Int)]的列表中,您可以使用解壓縮功能,其類型爲

[(a,b)] -> ([a],[b])

因此,要獲得看起來像[(字符串,整數)列表的平均值,則只需使用:

(sum $ snd $ unzip myList)/length(myList)

您需要更正該類型,以便可以使用fromIntegral函數進行分割。

所以,你可以寫如下功能:

average :: [(a,Int)] -> Double

average xs = (fromIntegral $ sum $ snd $ unzip xs)/(fromIntegral $ length xs)