Qual é exatamente a diferença entre mod
e rem
em Haskell?
Ambos parecem dar os mesmos 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
mod
ulus ==rem
ainder.div
equot
Respostas:
Eles não são os mesmos quando o segundo argumento é negativo:
fonte
rem
emod
em Clojure, e essa era a resposta.rem
é o mais rápido.Sim, essas funções agem de maneira diferente. Conforme definido na documentação oficial :
quot
é a divisão inteira truncada em direção a zerorem
é um número inteiro restante, satisfazendo:div
é a divisão inteira truncada em direção ao infinito negativomod
é um módulo inteiro, satisfazendo:Você pode realmente notar a diferença quando usa um número negativo como segundo parâmetro e o resultado não é zero:
fonte
mod
erem
associado mais fortemente do que(-)
. Editei o seu comentário, pois parece que não consigo colocar coisas com várias linhas neste comentário.(-5) `mod` 3 == 1
Praticamente falando:
Se você sabe que ambos os operandos são positivos, você deve geralmente usar
quot
,rem
ouquotRem
para a eficiência.Se você não sabe que ambos os operandos são positivos, deve pensar em como deseja que os resultados sejam. Você provavelmente não quer
quotRem
, mas também nãodivMod
. A(x `div` y)*y + (x `mod` y) == x
lei é muito boa, mas a divisão de arredondamento em direção ao infinito negativo (divisão no estilo de Knuth) costuma ser menos útil e menos eficiente do que garantir isso0 <= x `mod` y < y
(divisão euclidiana).fonte
Caso você queira apenas testar a divisibilidade, use sempre
rem
.Essencialmente
x `mod` y == 0
é equivalente ax `rem` y == 0
, masrem
é mais rápido quemod
.fonte