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: