web-dev-qa-db-ja.com

2つのInt値を分割してFloatを取得する正しい方法は何ですか?

Haskellで2つのInt値を分割し、結果をFloatとして取得したいと思います。私はこのようにそれをやってみました:

foo :: Int -> Int -> Float
foo a b = fromRational $ a % b

しかし、GHC(バージョン6.12.1)は、式のaに関して、「期待される型「整数」を推測される型「整数」と一致させることができませんでした」と言っています。

理由は理解できます。fromRational呼び出しでは(%)を生成するためにRatio Integerが必要なので、オペランドはIntegerではなくInt型である必要があります。しかし、私が分割している値はIntの範囲制限にほど遠いので、任意精度のbignum型を使用するのはやり過ぎのようです。

これを行う正しい方法は何ですか?オペランドでtoIntegerを呼び出す必要がありますか、それとも私が知らないより良いアプローチ((%)と比率を含まないアプローチ)がありますか?

30
Wyzard

オペランドを浮動小数点数に変換する必要があります最初次に除算します。そうでない場合は、整数除算(小数点以下の桁数なし)を実行します。

簡潔な解決策(Data.Functionが必要)

foo = (/) `on` fromIntegral

の略です

foo a b = (fromIntegral a) / (fromIntegral b)

foo :: Int -> Int -> Float
36
Dario