Ints的列表平均值

时间:2015-01-11 20:59:49

标签: haskell

我是Haskell和Stackoverflow的新手,我正在尝试自学Haskell编程,我正在从我下载的一本书中做一系列练习,并且想知道你们是否可以帮助我。

我正在尝试编写一个名为avgPub的函数,它返回一系列图书的所有出版年份的平均值。函数参数是:avgPub :: [(String,String,Int)] - >诠释。输入/输出的一个例子是,

> avgPub [("publisher", "book", 1920), ("publisher1", "book1", 1989), ("publisher2", "book2", 1920)]
1943

昨天,我了解了div,sum和map,但我不确定如何将这一切联系起来解决这个问题(正如练习所暗示的那样)。我认为要找到Ints列表的平均值,你会list (x:xs) = (sum (x:xs)) div length,但我们处理的不仅仅是Ints,所以这不起作用。

我无法弄清楚如何将它们组合在一起。

3 个答案:

答案 0 :(得分:2)

您使用year' :: [(String, String, Int)] -> Int走在正确的轨道上。您希望以某种方式从所有记录中提取年份字段,以便能够对它们进行平均。

最简单的方法是编写一个带有单个记录的函数并提取年份。即像这样:

year :: (String, String, Int) -> Int
year (_, _, i) = i

(请注意,第一个参数不是列表)

然后你可以创建另一个函数years,从记录列表中获取Int的列表:

years :: [(String, String, Int)] -> [Int]
years xs = map year xs

然后您需要做的就是将其与用于计算Int s列表平均值的代码放在一起:

average :: [Int] -> Int
average xs = (sum xs) `div` (length xs)

把它绑在一起:

avgPub books = average (years books)

答案 1 :(得分:0)

提示:

year' :: [(String, String, Int)] -> [Int]
year' = map (\(_,_,i) -> i)

哦,如果你找到了可行的东西,可以把它放在https://codereview.stackexchange.com/上,就像你说你是Haskell的新手一样。

答案 2 :(得分:0)

将它们捆绑在一起"作为初学者,您可以使用以下样式编写代码:

avgPub books = result where
    result = average yearlist
    yearlist = map year' books

过了一会儿,你将其缩短为

avgPub = average . map year'