web-dev-qa-db-ja.com

HaskellのIntからsqrtを取得する

sqrtからIntを取得するにはどうすればよいですか。

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

sqrt . fromInteger x

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

27
0xAX

fromIntegralの使用:

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

IntIntegerはどちらもIntegralのインスタンスです。

  • fromIntegral :: (Integral a, Num b) => a -> bは、IntIntegralのインスタンス)を取得して、Numにします。

  • sqrt :: (Floating a) => a -> aFloatingを期待し、FloatingFractionalから継承します。これはNumから継承するため、sqrtfromIntegralの結果を安全に渡すことができます

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

39
MarcoS

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

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

floorceilingまたはroundに置き換えることができます。 (ところで、この関数は、私が指定したものよりも一般的なタイプです。)

40
augustss

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

sqrt $ fromIntegral x

その後

fromIntegral x 

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

または、コンポジションがどのように機能するかを確認したい場合:

(sqrt .  fromIntegral) x

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

11
Edward