我正在教自己Haskell。
我想编写一个递归查找第一个数字的函数,该数字具有整数平方根并且小于起始数。
看起来像这样:
findFirstSquare :: Int -> Int
findFirstSquare x
| x <= 0 = error "This function only works for 1 or above"
| fromInteger(floor(sqrt(x))) == (sqrt x) = x
| otherwise = intSqrt(x - 1)
但GHC抱怨道:
在[...]使用“floor”时没有(RealFrac Int)的实例
但是,如果我在GHCi中键入以下内容,它会愉快地编译它:
fromInteger(floor(sqrt(4))) == (sqrt 4)
我的问题是:为什么我从GHCi中成功编译的表达式中得到类型错误?
答案 0 :(得分:9)
好的,我明白了。
不同之处在于常量“4”被重载,因此交互式sqrt(4)获得 Float 4的平方根
但是我的函数将x声明为 Int ,因此我需要将一个fromIntegral添加到对sqrt的调用中,以便它们能够正常工作。
将中卫换到以下位置就可以了:
| fromIntegral(floor(sqrt(fromIntegral(x)))) == (sqrt(fromIntegral(x))) = x