我已經得到另一個列表中的元組列表,並且在找到平均值時遇到問題。Haskell - 一起添加列表中的元組?
我檢查了問題和互聯網,但大多數時間他們不包括將所有的元組添加到一起和潛水。
我的目錄列表元組是[(String, Int)]
,我希望能夠找到的所有元組的平均值。
我已經得到另一個列表中的元組列表,並且在找到平均值時遇到問題。Haskell - 一起添加列表中的元組?
我檢查了問題和互聯網,但大多數時間他們不包括將所有的元組添加到一起和潛水。
我的目錄列表元組是[(String, Int)]
,我希望能夠找到的所有元組的平均值。
如果你搜索網,你會發現許多average :: (Real a, Fractional b) => [a] -> b
功能,e.g. here。
所以,你只需要[(String, Int)] -> [Int]
類型的函數,那麼你可以把兩者結合起來。
您可以很容易地將其轉換爲map snd
的簡單整數列表。所以基本上,sum $ map snd listOfTuples
將它們加在一起。 (爲了有效地計算平均,你可能想要做的東西多一點複雜的,但這應該把你在正確的軌道上。)
這個暗示指向瞭解決這類問題的慣用Haskell風格。你也可以通過使用遞歸輔助函數或者使用foldl來解決它(可能更高效?),但這兩種方法都比較長,可以說不那麼清晰,並且不太習慣...... – comingstorm 2012-04-17 00:28:33
下面就來計算的單程之和長度的方法。
它不漂亮,但它的工作原理。
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
而且列表,給出的形式[(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)
什麼平均?元組內的整數? – 2012-04-16 21:56:07
對不起,我應該更清楚。 – JamieB 2012-04-16 21:56:25
您是否在意效率? – 2012-04-16 22:01:06