4

我正在自学 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 抱怨:

(RealFrac Int) 没有因在 ...

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

 fromInteger(floor(sqrt(4))) == (sqrt 4)

我的问题是:为什么在 GHCi 中成功编译的表达式会出现类型错误?

4

1 回答 1

9

好的,我想通了。

不同之处在于常量“4”被重载,所以交互式 sqrt(4) 得到Float 4的平方根

但是我的函数将 x 声明为Int,因此我需要在对 sqrt 的调用中添加一个 fromIntegral ,这样它们才能工作。

将中间后卫改为以下就可以了:

| fromIntegral(floor(sqrt(fromIntegral(x)))) == (sqrt(fromIntegral(x))) = x
于 2009-08-20T07:26:57.300 回答