【问题标题】:List Average for Ints列出整数的平均值
【发布时间】:2015-01-11 20:59:48
【问题描述】:

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

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

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

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

我无法弄清楚如何将它们联系在一起。

【问题讨论】:

    标签: haskell


    【解决方案1】:

    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
    

    那么你需要做的就是把它和计算Ints列表平均值的代码放在一起:

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

    把它绑在一起:

    avgPub books = average (years books)
    

    【讨论】:

    • 我对您从哪里获得“书籍”以及 year 函数应该是什么样子感到有些困惑。我还是很迷茫。此外,avgPub 不应该接受字符串的一个参数,因此“avgPub books = average (years books)”不太有意义(avgPub :: [(String, String, Int)] -> Int)。
    • books 只是avgPub 的第一个参数的名称。它不必表示字符串,它可以是[(String, String, Int)]。我添加了如何编写year。
    • 感谢您的宝贵时间!这非常有帮助!
    【解决方案2】:

    提示:

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

    哦,如果你发现一些有用的东西,把它放在 https://codereview.stackexchange.com/ 上,就像你说你是 Haskell 的新手一样。

    【讨论】:

    • 我更新了我的问题。我有一个创建 Ints 列表(年份')的函数和一个查找 Ints 列表之和的函数(sum'),但我无法将它们捆绑在一起。
    【解决方案3】:

    对于“将所有东西捆绑在一起”部分,作为初学者,您可以使用以下样式编写代码:

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

    一段时间后,您会将其缩短为

    avgPub = average . map year'
    

    【讨论】:

    • 我现在很困惑,所以让我备份一下。我有一个名为 avgPub 的函数,它接受 2 个字符串和一个 Int 的列表。用户可以在命令行中输入多套书籍(例如 avgPub [("publisher", "book", 1920), ("publisher1", "book1", 1989), ("publisher2", "book2", 1920 )...])。我了解如何提取年份并将它们放入列表中,如我的“年份”函数所示。我知道如何找到列表的平均值,如我的平均函数所示。话虽如此,我仍然不明白如何将您的建议应用到我拥有的信息中。
    • 根据你的说法,我得到了这个(链接到 JPG 截图):puu.sh/eoiL7/8e03d849df.png,但我不知道如何让它工作。我收到这些错误:puu.sh/eoiZr/ffacf90de6.png
    • 这是因为你的年份函数应该是 (String,String,Int) -> Int。调整类型并从中删除地图。 (我知道你听从了某人的建议,但老实说,想想你如何从一本不在列表中的书中提取年份?)
    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 2011-08-04
    • 1970-01-01
    • 2020-09-06
    相关资源
    最近更新 更多