我是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进行编译。由于我遵循教科书示例,因此我需要保留函数签名。如何修改此代码,以便我不再收到上述错误?
答案 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]