tipos pattern opciones listas hacer funciones ejercicios definir como haskell types floating-point integer

haskell - pattern - ¿Cuál es la forma correcta de dividir dos valores de Int para obtener un flotador?



ord haskell (1)

Me gustaría dividir dos valores de Int en Haskell y obtener el resultado como un Float . Intenté hacerlo así:

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

pero GHC (versión 6.12.1) me dice "No se pudo hacer coincidir el tipo esperado ''Integer'' con el tipo inferido ''Int''" con respecto a la a en la expresión.

Entiendo por qué: la llamada fromRational requiere (%) para producir un Ratio Integer , por lo que los operandos deben ser de tipo Integer lugar de Int . Pero los valores que estoy dividiendo no se acercan al límite del rango Int , por lo que el uso de un tipo de bignum de precisión arbitraria parece excesivo.

¿Cuál es la forma correcta de hacer esto? ¿Debo llamar a toInteger en mis operandos o hay un mejor enfoque (tal vez uno que no incluya (%) y proporciones) que no conozco?


Primero debe convertir los operandos a flotantes y luego dividir, de lo contrario, realizará una división entera (sin decimales).

Solución lacónica (requiere Data.Function )

foo = (/) `on` fromIntegral

que es corto para

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

con

foo :: Int -> Int -> Float