GHC类型错误,我不明白

Joo*_*oon 4 haskell ghc

我正在教自己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)
Run Code Online (Sandbox Code Playgroud)

但GHC抱怨说:

(RealFrac Int)没有因使用'floor'而产生的实例......

但是,如果我在GHCi中键入以下内容,它会愉快地编译它:

 fromInteger(floor(sqrt(4))) == (sqrt 4)
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么我从GHCi中成功编译的表达式中得到类型错误?

Joo*_*oon 9

好的,我明白了.

区别在于常量"4"被重载,因此交互式sqrt(4)获得Float 4的平方根

但是我的函数将x声明为Int,因此我需要将一个fromIntegral添加到对sqrt的调用中,以便它们可以工作.

将中间护卫改为以下是诀窍:

| fromIntegral(floor(sqrt(fromIntegral(x)))) == (sqrt(fromIntegral(x))) = x
Run Code Online (Sandbox Code Playgroud)