32

sqrtからどうやって入手できますかInt

私はそうしようとします:

sqrt . fromInteger x

ただし、型の互換性でエラーが発生します。

4

3 に答える 3

50

おそらく、結果Intも同様にしたいですか?

isqrt :: Int -> Int
isqrt = floor . sqrt . fromIntegral

またはに置き換えることができfloorます。(ところで、この関数には、私が与えたものよりも一般的な型があります。)ceilinground

于 2011-07-14T15:23:17.647 に答える
48

使用fromIntegral:

Prelude> let x = 5::Int
Prelude> sqrt (fromIntegral  x)
2.23606797749979

Intとの両方Integerが のインスタンスですIntegral:

  • fromIntegral :: (Integral a, Num b) => a -> bIntあなたの(のインスタンスである)を取り、Integralそれを「作ります」Num

  • sqrt :: (Floating a) => a -> aから継承するFloating, and Floatinginherit from を期待するので、 の結果に安全に渡すことができますFractionalNumsqrtfromIntegral

この場合、Haskell Wikibookのクラスが非常に役立つと思います。

于 2011-07-14T14:58:42.823 に答える
12

アプリケーションは、他のどのオペレーターよりも緊密にバインドされることを忘れないでください。それには構成が含まれます。あなたが欲しいのは

sqrt $ fromIntegral x

それで

fromIntegral x 

暗黙的なアプリケーション (スペース) は明示的なアプリケーション ($) よりも強くバインドされるため、最初に評価されます。

または、構成がどのように機能するかを確認したい場合は、次のようにします。

(sqrt .  fromIntegral) x

括弧は、合成演算子が最初に評価され、次に結果の関数がアプリケーションの左側にあることを確認します。

于 2011-07-14T15:02:11.657 に答える