Saltar al contenido

¿Por qué es imposible dividir un número entero en Haskell?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *