Haskell - 在列表中一起添加元组?

时间:2012-04-16 21:53:36

标签: haskell

我在另一个列表中有一个元组列表,我在找到平均值时遇到了问题。

我已经检查了问题和互联网,但大部分时间他们都不会将所有元组加在一起并潜水。

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

4 个答案:

答案 0 :(得分:4)

您可以使用map snd轻松将其转换为简单整数列表。基本上,sum $ map snd listOfTuples将它们全部加在一起。 (为了有效地计算平均值,你可能想要做一些更复杂的事情,但这应该让你走上正确的轨道。)

答案 1 :(得分:1)

另外,给定[(String,Int)]形式的列表,您可以使用解压缩函数,其类型为

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

因此,要获得看起来像[(String,Int)]的列表的平均值,您只需使用:

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

您需要更正类型,以便可以使用fromIntegral函数进行分割。

因此,您可以编写以下函数:

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

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

答案 2 :(得分:0)

如果您在网上搜索,则会发现许多average :: (Real a, Fractional b) => [a] -> b个功能,e.g. here

所以你只需要一个[(String, Int)] -> [Int]类型的函数,然后就可以把它们放在一起了。

答案 3 :(得分: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)]

请注意,如果您有所有Ints的列表,则可能必须使用fromIntegral