@@ -15,9 +15,10 @@ module Prelude
1515 , Monad, return, liftM1, ap
1616 , Semiring, (+), zero, (*), one
1717 , Ring, (-)
18− -- , (%)
18+ , (%)
1919 , negate
20− , DivisionRing, (/)
20+ , ModuloRing, (/), mod
21+ , DivisionRing
2122 , Num
2223 , Eq, (==), (/=), refEq, refIneq
2324 , Ord, Ordering(..), compare, (<), (>), (<=), (>=)
@@ -204,7 +205,7 @@ module Prelude
204205
205206 infixl 7 *
206207 infixl 7 /
207− -- infixl 7 %
208+ infixl 7 %
208209
209210 infixl 6 -
210211 infixl 6 +
@@ -223,11 +224,17 @@ module Prelude
223224 negate :: forall a. (Ring a) => a -> a
224225 negate a = zero - a
225226
226− -- | Ring with division (possibly non-commutative field)
227− class (Ring a) <= DivisionRing a where
227+ -- | Ring with modulo operation and division where
228+ -- | ```a / b * b + (a `mod` b) = a```
229+ class (Ring a) <= ModuloRing a where
228230 (/) :: a -> a -> a
231+ mod :: a -> a -> a
229232
230− -- | Definitely commutative field
233+ -- | Ring where every nonzero element has a multiplicative inverse (possibly
234+ -- | a non-commutative field) so that ```a `mod` b = zero```
235+ class (ModuloRing a) <= DivisionRing a
236+
237+ -- | A commutative field
231238 class (DivisionRing a) <= Num a
232239
233240 foreign import numAdd
@@ -275,6 +282,8 @@ module Prelude
275282 }
276283 """ :: Number -> Number -> Number
277284
285+ (%) = numMod
286+
278287 instance semiringNumber :: Semiring Number where
279288 (+) = numAdd
280289 zero = 0
@@ -284,8 +293,11 @@ module Prelude
284293 instance ringNumber :: Ring Number where
285294 (-) = numSub
286295
287− instance divisionRingNumber :: DivisionRing Number where
296+ instance moduloRingNumber :: ModuloRing Number where
288297 (/) = numDiv
298+ mod _ _ = 0
299+
300+ instance divisionRingNumber :: DivisionRing Number
289301
290302 instance numNumber :: Num Number
291303