2011-11-13 11 views
46

Tipo clase Integral tiene dos operaciones quot y div, sin embargo, en el Haskell 2010 Language Report no se especifica qué se supone que deben hacer. Suponiendo que div es una división integral, ¿qué significa quot de manera diferente, o cuál es el propósito de quot? ¿Cuándo usas uno y el otro?Operadores integrales quot vs. div

+1

Esto parece un enlace prometedor: http://cdsmith.wordpress.com/2007/06/02/learning-number-theory-and-haskell-the-division-algorithm/ –

Respuesta

88

Para citar sección 6.4.2 del informe Haskell:

El quot, rem, div, y mod métodos de clase satisfacer las leyes de si Y es distinto de cero:

(x `quot` y)*y + (x `rem` y) == x 
(x `div` y)*y + (x `mod` y) == x 

quot es número entero división 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.

+4

+1 para la discusión de cuándo puede preferir uno sobre el otro –

+16

o, de forma equivalente, el resultado de' mod' tiene el mismo signo que el divisor, mientras que el resultado de 'rem' tiene el mismo signo que el dividendo – newacct

+0

Gracias por la respuesta, especialmente por mencionar el párrafo en el HR. Solo buscaba en el capítulo 9. – Ingo

26

Los dos se comportan de manera diferente cuando se trata de números negativos. Considere:

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 en las que dan diferentes respuestas.

También, ver aquí: http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html

La definición de quot es "división entera trunca hacia cero", mientras que la definición para div es "división entera trunca hacia el infinito negativo".

+1

Usted sabe, también hay ' divMod' y 'quotRem' ... – fuz

Cuestiones relacionadas