Haskell返回多少输入大于其平均值

时间:2011-10-17 11:46:32

标签: haskell

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

  

错误文件:。\ AverageThree.hs:5 - 在应用程序中输入错误    *表达式:x y z    术语:x    类型:Int   * 不匹配:a - > b - > ç

     

代码:

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

有人帮助我吗?

2 个答案:

答案 0 :(得分:4)

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

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

其次,length的类型为[a] -> Int。由于此处没有列表,您必须使用其他功能或列表。

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

  1. x yz应用于averageThree
  2. 使用the filter function,将此计算平均值与每个传入的参数进行比较;这将产生一个清单。
  3. 查找结果列表的长度。
  4. 我执行此操作的代码如下:

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

答案 1 :(得分:2)

这里有很多问题:

  • length没有达到你想要的效果。 length会返回列表的长度,而howManyAvergageThree

  • 中没有列表
  • averageThree返回一个Float。 howManyAverageThree需要考虑到这一点。具体来说,>需要其参数属于同一类型。

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

这是一个有效的版本:

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