Haskell howManyAboveAverage无法匹配类型错误

时间:2017-04-04 15:38:01

标签: haskell

我是Haskell初学者,目前正在通过The Craft of Functional Programming 2nd Edition工作。本书中的一个练习要求我编写一个averageThree函数,我已经使用averageThree函数编写了一个howManyAboveAverage函数。

我有点担心如何做到这一点,但我发现了类似的问题here。我使用了我的代码中给出的解决方案但是我得到一个解析错误[FIXED]。

这是我的新代码:

averageThree :: Int -> Int -> Int -> Float
averageThree a b c = fromIntegral (a + b + c) / 3

howManyAverageThree :: Int -> Int -> Int -> Int
howManyAverageThree a b c = length $ filter (> avg) the_three
    where avg = averageThree a b c
          the_three = fromIntegral <$> [a,b,c]

编辑:新错误
错误跟踪:

[1 of 1] Compiling Main             ( average.hs, interpreted )

average.hs:7:36: Not in scope: `<$>'
Failed, modules loaded: none.

我使用ghci版本7.6.3进行编译。由于我遵循教科书示例,因此我需要保留函数签名。如何修改此代码,以便我不再收到上述错误?

1 个答案:

答案 0 :(得分:1)

在Haskell,indentation does matter。您需要匹配where子句中的缩进:

howManyAverageThree :: Int -> Int -> Int -> Int
howManyAverageThree a b c = length $ filter (> avg) the_three
    where avg = averageThree a b c
          the_three = fromIntegral[a b c]

编辑: 在您对问题进行修改后,您需要更仔细地查看the_three的定义:

the_three = fromIntegral[a b c]

fromIntegral的类型为:: (Integral a, Num b) => a -> b

如果您希望the_three成为数字列表,则需要做一些事情。 首先,您的列表构造需要,里面的内容。其次,您需要在该列表的每个元素上映射fromIntegral

import Control.Applicative((<$>))
....

the_three = fromIntegral <$> [a,b,c]