una qué que pueden porque piedra para niños los informacion hunde hunda hechos hace flotar flotan explicacion experimentos experimento como barcos barco acero haskell floating-point integer

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)