質問

私は自分自身にハスケルを教えています。

整数平方根を持つ最初の数字を再帰的に見つけて、開始数よりも小さい関数を書きたいと思います。

このように見えます:

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」が過負荷になっているため、インタラクティブなSQRT(4)がの平方根を取得していることです。 浮く 4

ただし、私の関数はxをasとして宣言します int, したがって、SQRTへの呼び出しにINTEGRALを追加する必要がありました。

ミドルガードを次のように変更しました。

| fromIntegral(floor(sqrt(fromIntegral(x)))) == (sqrt(fromIntegral(x))) = x
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top