git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Add `ModuloRing`
bbf00f2Gary Burgess
prelude/prelude.purs+19−7
@@ -15,9 +15,10 @@ module Prelude
15 , Monad, return, liftM1, ap
15 , Monad, return, liftM1, ap
16 , Semiring, (+), zero, (*), one
16 , Semiring, (+), zero, (*), one
17 , Ring, (-)
17 , Ring, (-)
18− -- , (%)
18+ , (%)
19 , negate
19 , negate
20− , DivisionRing, (/)
20+ , ModuloRing, (/), mod
21+ , DivisionRing
21 , Num
22 , Num
22 , Eq, (==), (/=), refEq, refIneq
23 , Eq, (==), (/=), refEq, refIneq
23 , Ord, Ordering(..), compare, (<), (>), (<=), (>=)
24 , Ord, Ordering(..), compare, (<), (>), (<=), (>=)
@@ -204,7 +205,7 @@ module Prelude
204
205
205 infixl 7 *
206 infixl 7 *
206 infixl 7 /
207 infixl 7 /
207− -- infixl 7 %
208+ infixl 7 %
208
209
209 infixl 6 -
210 infixl 6 -
210 infixl 6 +
211 infixl 6 +
@@ -223,11 +224,17 @@ module Prelude
223 negate :: forall a. (Ring a) => a -> a
224 negate :: forall a. (Ring a) => a -> a
224 negate a = zero - a
225 negate a = zero - a
225
226
226− -- | Ring with division (possibly non-commutative field)
227+ -- | Ring with modulo operation and division where
228+ -- | ```a / b * b + (a `mod` b) = a```
227− class (Ring a) <= DivisionRing a where
229+ class (Ring a) <= ModuloRing a where
228 (/) :: a -> a -> a
230 (/) :: a -> a -> a
231+ mod :: a -> a -> a
229
232
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+
230− -- | Definitely commutative field
237+ -- | A commutative field
231 class (DivisionRing a) <= Num a
238 class (DivisionRing a) <= Num a
232
239
233 foreign import numAdd
240 foreign import numAdd
@@ -275,6 +282,8 @@ module Prelude
275 }
282 }
276 """ :: Number -> Number -> Number
283 """ :: Number -> Number -> Number
277
284
285+ (%) = numMod
286+
278 instance semiringNumber :: Semiring Number where
287 instance semiringNumber :: Semiring Number where
279 (+) = numAdd
288 (+) = numAdd
280 zero = 0
289 zero = 0
@@ -284,8 +293,11 @@ module Prelude
284 instance ringNumber :: Ring Number where
293 instance ringNumber :: Ring Number where
285 (-) = numSub
294 (-) = numSub
286
295
287− instance divisionRingNumber :: DivisionRing Number where
296+ instance moduloRingNumber :: ModuloRing Number where
288 (/) = numDiv
297 (/) = numDiv
298+ mod _ _ = 0
299+
300+ instance divisionRingNumber :: DivisionRing Number
289
301
290 instance numNumber :: Num Number
302 instance numNumber :: Num Number
291
303
src/Language/PureScript/CodeGen/JS/Optimizer/Inliner.hs+1−1
@@ -104,7 +104,7 @@ inlineCommonOperators = applyAll $
104 , binary C.semiringNumber (C.*) Multiply
104 , binary C.semiringNumber (C.*) Multiply
105 , binary C.ringNumber (C.-) Subtract
105 , binary C.ringNumber (C.-) Subtract
106 , unary C.ringNumber C.negate Negate
106 , unary C.ringNumber C.negate Negate
107− , binary C.divisionRingNumber (C./) Divide
107+ , binary C.moduloRingNumber (C./) Divide
108 --, binary C.numNumber (C.%) Modulus
108 --, binary C.numNumber (C.%) Modulus
109
109
110 , binary C.ordNumber (C.<) LessThan
110 , binary C.ordNumber (C.<) LessThan
src/Language/PureScript/Constants.hs+2−2
@@ -175,8 +175,8 @@ semiringNumber = "semiringNumber"
175ringNumber :: String
175ringNumber :: String
176ringNumber = "ringNumber"
176ringNumber = "ringNumber"
177
177
178−divisionRingNumber :: String
178+moduloRingNumber :: String
179−divisionRingNumber = "divisionRingNumber"
179+moduloRingNumber = "moduloRingNumber"
180
180
181numNumber :: String
181numNumber :: String
182numNumber = "numNumber"
182numNumber = "numNumber"