length - funcion abs en haskell
Diferencia entre `mod` y` rem` en Haskell (4)
En caso de que solo desee probar la divisibilidad, siempre debe usar rem
.
Esencialmente x `mod` y == 0
es equivalente a x `rem` y == 0
, pero rem
es más rápido que mod
.
¿Cuál es exactamente la diferencia entre mod
y rem
en Haskell?
Ambos parecen dar los mismos resultados
*Main> mod 2 3
2
*Main> rem 2 3
2
*Main> mod 10 5
0
*Main> rem 10 5
0
*Main> mod 1 0
*** Exception: divide by zero
*Main> rem 1 0
*** Exception: divide by zero
*Main> mod 1 (-1)
0
*Main> rem 1 (-1)
0
Hablando practicamente:
Si sabe que ambos operandos son positivos, generalmente debería usar quot
, rem
o quotRem
para mayor eficiencia.
Si no sabe que ambos operandos son positivos, debe pensar en cómo quiere que sean los resultados. Probablemente no quieras quotRem
, pero es posible que tampoco quieras divMod
. La (x `div` y)*y + (x `mod` y) == x
es muy buena, pero redondear la división hacia el infinito negativo (división de estilo Knuth) a menudo es menos útil y menos eficiente que asegurar que 0 <= x `mod` y < y
(división euclidiana).
No son lo mismo cuando el segundo argumento es negativo:
2 `mod` (-3) == -1
2 `rem` (-3) == 2
Sí, esas funciones actúan de manera diferente. Como se define en la documentación oficial :
quot
es la división entera truncada hacia cero
rem
es un resto entero, que satisface:
(x `quot` y)*y + (x `rem` y) == x
div
es una división entera truncada hacia el infinito negativo
mod
es un módulo entero, que satisface:
(x `div` y)*y + (x `mod` y) == x
Realmente puede notar la diferencia cuando usa un número negativo como segundo parámetro y el resultado no es cero:
5 `mod` 3 == 2
5 `rem` 3 == 2
5 `mod` (-3) == -1
5 `rem` (-3) == 2
(-5) `mod` 3 == 1
(-5) `rem` 3 == -2
(-5) `mod` (-3) == -2
(-5) `rem` (-3) == -2