haskell - qué - Entero para flotar
que es flotar explicacion para niños (4)
Este código funciona:
posToXY :: Float -> Float -> Integer
posToXY a b = do
let y = a / b
round y
Pero esto no funciona:
posToXY :: Integer -> Integer -> Integer
posToXY a b = do
let y = a / b
round y
Entiendo que la operación ''/'' no define para el tipo Integer, pero no sé cómo corregir el código para trabajar con los parámetros Integer.
Puede usar fromIntegral
para convertir cualquier tipo Integral en cualquier tipo Num. Asi que:
let y = fromIntegral a / fromIntegral b
Si desea realizar una división fraccionaria, puede convertir desde cualquier tipo Integral
usando fromIntegral
, o fromInteger
para convertir solo desde Integer
específicamente.
Existen funciones similares relacionadas con otras clases de tipos numéricos: toRational
, fromRational
, realToFrac
, etc. Y, por supuesto, puede convertir tipos fraccionarios de nuevo a tipos integrales usando round
, floor
, ceiling
, etc.
Y, finalmente, en la posibilidad remota de que realmente deseara una división entera , en lugar de una división fraccionada con redondeo posterior, están las funciones div
y quot
(según el comportamiento de truncamiento que desee).
Además, probablemente deberías escribir tu función como algo como posToXY ab = round $ a / b
. Lo innecesario y las múltiples líneas hacen que sea más difícil de leer.
Si quieres división entera, puedes usar div
.
posToXY :: Integer -> Integer -> Integer
posToXY = div
Tenga en cuenta que esto no es exactamente lo mismo que redondear una división de punto flotante, porque div
siempre se redondea.
Para una firma de tipo más general, puede hacer esto en su lugar
p :: (Real a, Real a1, Integral b) => a -> a1 -> b
posToXY a b = round (realToFrac a / realToFrac b)
Su código podría simplificarse fácilmente para
posToXY :: Float -> Float -> Integer
posToXY a b = round (a / b)
Entonces
posToXY :: Integer -> Integer -> Integer
posToXY a b = round (fromIntegral a / fromIntegral b)