2012-04-16 49 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)