我已经得到另一个列表中的元组列表,并且在找到平均值时遇到问题。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