rem length funcion even abs haskell

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