tutorial - haskell simbolos
Operadores integrales quot vs. div (2)
Tipo de clase Integral tiene dos operaciones, quot
y div
, pero en el Haskell 2010 Language Report no se especifica qué se supone que deben hacer. Suponiendo que div
es una división integral, ¿qué tiene quot
diferente, o cuál es el propósito de quot
? ¿Cuándo usas uno y el otro?
Los dos se comportan de manera diferente cuando se trata de números negativos. Considerar:
Hugs> (-20) `divMod` 3
(-7,1)
Hugs> (-20) `quotRem` 3
(-6,-2)
Aquí, -7 * 3 + 1 = -20
y -6 * 3 + (-2) = -20
, pero las dos formas dan respuestas diferentes.
También, mira aquí: http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html
La definición de quot
es "división entera truncada hacia cero", mientras que la definición de div
es "división entera truncada hacia el infinito negativo".
Para citar la sección 6.4.2 del informe Haskell:
Los métodos quot
, rem
, div
y mod
class satisfacen estas leyes si y no es cero:
(x `quot` y)*y + (x `rem` y) == x
(x `div` y)*y + (x `mod` y) == x
quot
es la división entera truncada hacia cero, mientras que el resultado de div
se trunca hacia el infinito negativo.
La función div
es a menudo la más natural de usar, mientras que la función quot
corresponde a la instrucción de la máquina en máquinas modernas, por lo que es algo más eficiente.