我是
Haskell和Stackoverflow的新手,我正在尝试自学Haskell编程,我正在从我下载的一本书中做一系列练习,并想知道你们是否可以帮助我.
我正在尝试编写一个名为avgPub的函数,它返回一系列书籍出版所有年份的平均值.函数参数是:avgPub :: [(String,String,Int)] – >诠释.输入/输出的一个例子是,
> avgPub [("publisher", "book", 1920), ("publisher1", "book1", 1989), ("publisher2", "book2", 1920)]
1943
昨天,我了解了div,sum和map,但我不知道如何将这一切联系起来解决这个问题(正如练习所暗示的那样).我认为要找到Ints列表的平均值,你会列出(x:xs)=(sum(x:xs))divlength,但我们处理的不仅仅是Ints,所以这不起作用.
我无法弄清楚如何将它们组合在一起.
最佳答案 你在年份’:: [(String,String,Int)] – >的正确轨道上诠释.您希望以某种方式从所有记录中提取年份字段以便能够对它们进行平均.
最简单的方法是编写一个记录单个记录并提取年份的函数.即像这样:
year :: (String, String, Int) -> Int
year (_, _, i) = i
(注意第一个参数不是列表)
然后你可以创建另一个函数,年,从记录列表中获取Ints列表:
years :: [(String, String, Int)] -> [Int]
years xs = map year xs
然后,您需要做的就是将它与用于计算Ints列表平均值的代码放在一起:
average :: [Int] -> Int
average xs = (sum xs) `div` (length xs)
把它绑在一起:
avgPub books = average (years books)