Por fin después de mucho batallar pudimos dar con la contestación de este inconveniente que ciertos usuarios de este sitio presentan. Si tienes algún dato que compartir puedes compartir tu conocimiento.
Solución:
Porque el Integer
tipo no tiene Fractional
ejemplo.
El tipo para (/)
es Fractional a => a -> a -> a
. Considere lo que sucede cuando a = Integer
. Tendrías Integer -> Integer -> Integer
. Pero 1/2
es no un entero, es 0.5
. Entonces, la única forma de ajustar el operador de división sería ronda el resultado. Pero hay no una sola forma de redondeo, y la mejor elección depende de la aplicación, por lo que se decidió no proporcionar esa instancia.
Si quieres realizar División entera utilizar el div
o quot
funciones (utilizan diferentes redondeos). De lo contrario, conviértalo en algo que admita una operación de división bien definida como Rational
(esto es lo que el fromIntegral
está haciendo).
Porque el operador de división para enteros tiene dos resultados (cociente y resto):
divMod :: Integer -> Integer -> (Integer, Integer)
También puede utilizar el div
operador:
n `div` m
que devuelve solo un componente del resultado de la división (el cociente), pero eso no es lo mismo que n / m
. /
es para tipos donde el operador de división tiene solo un resultado que combina ‘cociente’ y ‘resto’ en una fracción.
Igualmente, si (q, r) = n `divMod` m
, entonces
n = m * q + r
mientras que si q = x / y
, entonces
x = y * q
(hasta las advertencias habituales sobre números de punto flotante y aproximaciones).
Sustituyendo div
por /
rompe esa relación, porque desecha parte de la información que necesita para reproducir n
.
Si conservas alguna sospecha y disposición de reaccionar nuestro reseña eres capaz de escribir una crítica y con placer lo observaremos.