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は不平を言います:

での`floor'の使用から生じる(RealFrac Int)のインスタンスはありません...

ただし、GHCiに次のように入力すると、正常にコンパイルされます。

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

私の質問は、GHCiで正常にコンパイルされる式から型エラーが発生するのはなぜですか?

4

1 に答える 1

9

わかりました、わかりました。

違いは、定数「4」がオーバーロードされているため、インタラクティブにsqrt( 4 )がFloat4の平方根を取得していることです。

ただし、私の関数はxをIntとして宣言しているため、sqrtの呼び出しにfromIntegralを追加して、それらが機能するようにする必要がありました。

ミドルガードを次のように変更すると、トリックが実行されました。

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