web-dev-qa-db-ja.com

浮動する整数

このコードは機能します:

posToXY :: Float -> Float -> Integer
posToXY a b = do
        let y = a / b
        round y

しかし、これは機能しません:

posToXY :: Integer -> Integer -> Integer
posToXY a b = do
        let y = a / b
        round y

操作 '/'が整数型を定義していないことは理解していますが、整数パラメーターを処理するようにコードを修正する方法がわかりません。

20
demas

分数除算を実行する場合は、IntegralまたはfromIntegralを使用して任意のfromInteger型から変換し、具体的にはIntegerからのみ変換できます。

他の数値型クラスに関連する同様の関数があります:toRationalfromRationalrealToFracなど。もちろん、roundfloorceilingなど。

そして最後に、あなたが実際に望んでいた偶然の機会にinteger除算、後で丸める分数除算の代わりに、div関数とquot関数があります(切り捨てに応じて)あなたが望む行動)。

また、関数はposToXY a b = round $ a / bのように書く必要があります。不要なdoと複数行があると、読みにくくなります。

27
C. A. McCann

fromIntegralを使用して、任意の整数型を任意のNum型に変換できます。そう:

let y = fromIntegral a / fromIntegral b
7
sepp2k

コードは簡単に次のように簡略化できます

posToXY :: Float -> Float -> Integer
posToXY a b = round (a / b)

次に

posToXY :: Integer -> Integer -> Integer
posToXY a b = round (fromIntegral a / fromIntegral b)
7
Dave Clarke

整数除算が必要な場合は、divを使用できます。

posToXY :: Integer -> Integer -> Integer
posToXY = div

divは常に切り捨てられるため、これは浮動小数点除算の丸めとはまったく同じではないことに注意してください。

より一般的な型の署名については、代わりにこれを行うことができます

p :: (Real a, Real a1, Integral b) => a -> a1 -> b
posToXY a b = round (realToFrac a / realToFrac b)
3
John L