質問
私は自分自身にハスケルを教えています。
整数平方根を持つ最初の数字を再帰的に見つけて、開始数よりも小さい関数を書きたいと思います。
このように見えます:
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
所属していません StackOverflow