列出整数的平均值

List Average for Ints

我是 Haskell 和 Whosebug 的新手,我正在尝试自学 Haskell 编程,我正在根据我下载的一本书做一系列练习,想知道你是否伙计们可以帮我解决这个问题。

我正在尝试编写一个名为 avgPub 的函数,它 returns 一系列书籍出版年份的平均值。函数参数是:avgPub :: [(String, String, Int)] -> Int。 input/output 的一个例子是,

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

昨天,我了解了 div、sum 和 map,但我不确定如何将它们联系在一起来解决这个问题(正如练习所暗示的那样)。我认为要找到 Int 列表的平均值,您需要 list (x:xs) = (sum (x:xs))divlength,但我们处理的不仅仅是 Int,所以这行不通。

我不知道如何将它们联系在一起。

提示:

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

哦,如果您发现有用的东西,请将其发布到 https://codereview.stackexchange.com/ 上,因为您说您是 Haskell.

的新手

year' :: [(String, String, Int)] -> Int 的方向是正确的。您想以某种方式从所有记录中提取年份字段以便能够对它们进行平均。

执行此操作的最简单方法是编写一个函数,该函数接受 单个 记录并提取年份。 IE。像这样:

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

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

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

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

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

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

将其捆绑在一起:

avgPub books = average (years books)

对于"tying it all together"部分,作为初学者,可以按照如下风格编写代码:

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

稍后,您会将其缩短为

avgPub = average . map year'