Division in Haskell
Esperanto • English
Last updated: May 22, 2019
While learning about division in Haskell, I realized that the concept is not as trivial as I initially wanted it to be. There are subtle differences between the functions that can easily trip someone who’s not aware of them. quot
performs integer division that rounds towards zero. div
is like quot
, but it rounds below zero—negative infinity. rem
returns the remainder of a division. mod
, on the other hand, performs modular arithmetic.
In the GHCi interaction below, quotRem
returns a tuple of the application of quot
and rem
to its arguments, while divMod
returns a tuple of the application div
and mod
to its arguments.
Prelude> quotRem 13 5
(2,3)
Prelude> quotRem (-13) 5
(-2,-3)
Prelude> quotRem 13 (-5)
(-2,3)
Prelude> quotRem 5 13
(0,5)
Prelude> quotRem (-5) 13
(0,-5)
Prelude> quotRem 5 (-13)
(0,5)
Prelude> divMod 13 5
(2,3)
Prelude> divMod (-13) 5
(-3,2)
Prelude> divMod 13 (-5)
(-3,-2)
Prelude> divMod 5 13
(0,5)
Prelude> divMod (-5) 13
(-1,8)
Prelude> divMod 5 (-13)
(-1,-8)
Giving special attention to negative numbers, here are some observations about it:
quotRem
anddivMod
behave the same, if all the arguments are positive.quot
returns0
, if the dividend is less than the divisor.rem
follows the sign of the dividend.rem
returns the dividend, if the dividend is less than the divisor.div
rounds off the divisor to the negative infinity, if either the dividend or divisor is negative.mod
follows the sign of the divisor.div
returns0
, if the dividend is less than the divisor, and both arguments are positive.mod
returns the dividend, if the dividend is less than the divisor, and both arguments are positive.div
returns-1
if the dividend is negative, and its absolute value is less than the divisor.quot
anddiv
returns0
if the dividend is0
, and the divisor is not zero.mod
returns the difference of the absolute values of the dividend and the divisor, following the sign of the divisor, if either the dividend or the divisor is negative, and if the absolute of the dividend is less than the absolute value of the divisor.- If either the dividend or divisor of
mod
is a negative, and that the absolute value of the dividend is larger than the abvolute value of the divisor,mod
returns a value such that when this value is added to the result of thediv
of the dividend and divisor, multiplied by the divisor, it returns the dividend ofmod
. That is:
So ifx == (x `mod` y) + (x `div` y) * y
x = (-13)
andy = 5
, then
evaluates to(-13) == ((-13) `mod` 5) + ((-13) `div` 5) * 5
True
.