sqrt
からどうやって入手できますかInt
。
私はそうしようとします:
sqrt . fromInteger x
ただし、型の互換性でエラーが発生します。
おそらく、結果Int
も同様にしたいですか?
isqrt :: Int -> Int
isqrt = floor . sqrt . fromIntegral
またはに置き換えることができfloor
ます。(ところで、この関数には、私が与えたものよりも一般的な型があります。)ceiling
round
使用fromIntegral
:
Prelude> let x = 5::Int
Prelude> sqrt (fromIntegral x)
2.23606797749979
Int
との両方Integer
が のインスタンスですIntegral
:
fromIntegral :: (Integral a, Num b) => a -> b
Int
あなたの(のインスタンスである)を取り、Integral
それを「作ります」Num
。
sqrt :: (Floating a) => a -> a
から継承するFloating
, and Floating
inherit from を期待するので、 の結果に安全に渡すことができますFractional
Num
sqrt
fromIntegral
この場合、Haskell Wikibookのクラス図が非常に役立つと思います。
アプリケーションは、他のどのオペレーターよりも緊密にバインドされることを忘れないでください。それには構成が含まれます。あなたが欲しいのは
sqrt $ fromIntegral x
それで
fromIntegral x
暗黙的なアプリケーション (スペース) は明示的なアプリケーション ($) よりも強くバインドされるため、最初に評価されます。
または、構成がどのように機能するかを確認したい場合は、次のようにします。
(sqrt . fromIntegral) x
括弧は、合成演算子が最初に評価され、次に結果の関数がアプリケーションの左側にあることを確認します。