sqrt
からInt
を取得するにはどうすればよいですか。
私はそうしようとします:
sqrt . fromInteger x
ただし、型の互換性でエラーが発生します。
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
を期待し、Floating
はFractional
から継承します。これはNum
から継承するため、sqrt
にfromIntegral
の結果を安全に渡すことができます
この場合、クラス diagram in Haskell Wikibook が非常に役立つと思います。
おそらく、結果もInt
にしたいですか?
isqrt :: Int -> Int
isqrt = floor . sqrt . fromIntegral
floor
をceiling
またはround
に置き換えることができます。 (ところで、この関数は、私が指定したものよりも一般的なタイプです。)
アプリケーションは他のどのオペレーターよりも緊密にバインドします。これには構成が含まれます。あなたが欲しいのは
sqrt $ fromIntegral x
その後
fromIntegral x
暗黙のアプリケーション(スペース)は明示的なアプリケーション($)よりも強く結合するため、最初に評価されます。
または、コンポジションがどのように機能するかを確認したい場合:
(sqrt . fromIntegral) x
括弧は、合成演算子が最初に評価され、その後、結果の関数がアプリケーションの左側になることを確認します。