verschil tussen `mod` en` rem` in Haskell

Wat is precies het verschil tussen moden remIN HASKELL?

Beide lijkt dezelfde resultaten te geven

*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

Antwoord 1, Autoriteit 100%

Ze zijn niet hetzelfde wanneer het tweede argument negatief is:

2 `mod` (-3)  ==  -1
2 `rem` (-3)  ==  2

Antwoord 2, Autoriteit 38%

Ja, die functies werken anders. Zoals gedefinieerd in de officiële documentatie :

quotis getal divisie afgekapt in de richting van nul

remIS GEEN TEGEERD REST, Bevredigend:

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

divis getal divisie afgekapt in de richting van negatieve infinity

modis een geheel getal modulus, bevredigend:

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

U kunt het verschil echt opmerken wanneer u een negatief getal gebruikt als tweede parameter en het resultaat is niet nul:

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

& nbsp;


Antwoord 3, Autoriteit 10%

praktisch gesproken:

Als u weet dat beide operanden positief zijn, moet u meestal quot, remof quotRemvoor efficiëntie gebruiken.

Als u niet weet dat beide operanden positief zijn, moet u nadenken over wat u wilt dat de resultaten eruit zien. U wilt waarschijnlijk niet quotRem, maar u wilt misschien niet divMod. De (x `div` y)*y + (x `mod` y) == xwet is een zeer goede, maar afrondingsafdeling in de richting van negatieve oneindigheid (divisie nevel) is vaak minder handig en minder efficiënt dan ervoor te zorgen dat 0 <= x `mod` y < y(Euclidese divisie).


Antwoord 4, Autoriteit 4%

Als u alleen wilt testen voor deelbaarheid, moet u altijd remgebruiken.

In wezen x `mod` y == 0is gelijk aan x `rem` y == 0, maar remis sneller dan mod.

Other episodes