我对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
有人帮助我吗?
答案 0 :(得分:4)
你遇到的麻烦来自几个地方。
首先,您没有应用length
或averageThree
这两个函数,因此也没有使用howManyAverageThree
的参数。
其次,length
的类型为[a] -> Int
。由于此处没有列表,您必须使用其他功能或列表。
如果我正确理解您所需的算法,您将需要做一些事情:
x
y
和z
应用于averageThree
。filter
function,将此计算平均值与每个传入的参数进行比较;这将产生一个清单。我执行此操作的代码如下:
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]
这利用了几个简洁的功能:
>
接受两个相同类型的参数,并返回一个Bool - 通过括在括号中并在一侧提供表达式,我已部分应用它,这允许它用作过滤器功能where
keyword。我用这个来清理一下,让它更具可读性。filter
函数,我在上面提到过。$
。此运算符只是将函数应用程序从左关联更改为右关联。答案 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