【问题标题】:Haskell returns how many inputs are larger than their average valueHaskell 返回有多少输入大于它们的平均值
【发布时间】:2011-10-17 20:42:54
【问题描述】:

我对haskell 很陌生,编写了一个简单的代码来返回有多少输入大于它们的平均值。我得到了错误:

ERROR file:.\AverageThree.hs:5 - 应用程序中的类型错误 * 表达式:x y z 术语:x 类型:整数 * 不匹配:a -> b -> c

代码:

averageThree :: Int -> Int -> Int -> Float
averageThree x y z = (fromIntegral x+ fromIntegral y+ fromIntegral z)/3

howManyAverageThree ::Int -> Int -> Int -> Int
howManyAverageThree x y z  = length > averageThree

有人帮帮我吗?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    你遇到的麻烦来自几个地方。

    首先,您没有应用lengthaverageThree 这两个函数,因此也没有使用howManyAverageThree 的参数。

    其次,length 的类型是[a] -> Int。由于此处没有列表,您要么必须使用不同的函数,要么制作一个列表。

    如果我正确理解了您想要的算法,您将需要做一些事情:

    1. 申请xyzaverageThree
    2. 使用the filter function,将此计算的平均值与每个传入的参数进行比较;这将产生一个列表。
    3. 找出结果列表的长度。

    我为此冲刺的代码如下:

    howManyAverageThree ::Int -> Int -> Int -> Int
    howManyAverageThree x y z = length $ filter (> avg) the_three
        where avg = averageThree x y z
              the_three = [fromIntegral x,fromIntegral y,fromIntegral z]
    

    这利用了几个简洁的功能:

    1. 柯里化,有时称为"partial function application"。这就是我使用的 (> avg);通常,中缀函数> 接受两个相同类型的参数,并返回一个 Bool - 通过括在括号中并在一侧提供表达式,我已部分应用它,这允许它用作过滤器函数
    2. The where keyword。我用它来清理它,使其更具可读性。
    3. filter 函数,我在上面提到过。
    4. Function application using $。此运算符只是将函数应用程序从左关联更改为右关联。

    【讨论】:

    • 术语挑剔:从技术上讲,#1 将被称为"section",这当然会使用部分应用程序。 “柯里化”一般是指制作一个函数,使其可以部分应用的行为,所以“柯里化”并不是你真正做的;在 Haskell 的情况下,默认情况下所有函数都是柯里化的。您还可以使用curry 对未咖喱化的 2 参数函数进行柯里化。
    • @DanBurton - 绝对。我最初从我之前的答案here 中剪掉了那个项目符号,但是因为它太冗长,所以剪掉了关于部分的文本。
    【解决方案2】:

    这里有很多问题:

    • length 不会做你想做的事。 length返回一个列表的长度,你的howManyAvergageThree里面没有列表

    • averageThree 返回一个浮点数。 howManyAverageThree 需要考虑到这一点。具体来说,> 需要其参数为同一类型。

    • 第二个函数中对averageThree的调用需要一些参数。

    这是一个工作版本:

    howManyAverageThree x y z = length [ i | i <- [x, y, z], fromIntegral i > avg]
            where avg = averageThree x y z
    

    【讨论】:

    • 错误文件:.\AverageThree.hs:4 - 未定义变量“i”
    • 我想我的列表理解的条款倒退了。把i &lt;- [x, y, z]放在第一位(就像在当前的编辑版本中一样)它对我有用。
    猜你喜欢
    • 1970-01-01
    • 2021-10-09
    • 2018-09-08
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多