このコードは機能します:
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
操作 '/'が整数型を定義していないことは理解していますが、整数パラメーターを処理するようにコードを修正する方法がわかりません。
分数除算を実行する場合は、Integral
またはfromIntegral
を使用して任意のfromInteger
型から変換し、具体的にはInteger
からのみ変換できます。
他の数値型クラスに関連する同様の関数があります:toRational
、fromRational
、realToFrac
など。もちろん、round
、floor
、ceiling
など。
そして最後に、あなたが実際に望んでいた偶然の機会にinteger除算、後で丸める分数除算の代わりに、div
関数とquot
関数があります(切り捨てに応じて)あなたが望む行動)。
また、関数はposToXY a b = round $ a / b
のように書く必要があります。不要なdo
と複数行があると、読みにくくなります。
fromIntegral
を使用して、任意の整数型を任意のNum型に変換できます。そう:
let y = fromIntegral a / fromIntegral b
コードは簡単に次のように簡略化できます
posToXY :: Float -> Float -> Integer
posToXY a b = round (a / b)
次に
posToXY :: Integer -> Integer -> Integer
posToXY a b = round (fromIntegral a / fromIntegral b)
整数除算が必要な場合は、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)