modular-arithmetic- A type for integers modulo some constant.

Safe HaskellNone



This module provides types for working with integers modulo some constant.

This module uses some new Haskell features introduced in 7.6. In particular, it needs DataKinds and type literals (GHC.TypeLits). The TypeOperators extension is needed for the nice infix syntax.

These types are created with the type constructor Mod (or its synonym /). To work with integers mod 7, you could write:

 Int Mod 7
 Integer Mod 7

(The last is a synonym for Integer provided by this library. In Emacs, you can use the Tex input mode to type it with Bbb{Z}.)

All the usual typeclasses are defined for these types. You can also get the constant using bound or extract the underlying value using unMod.

Here is a quick example:

 *Data.Modular> (10 :: ℤ7) * (11 :: ℤ7)

It also works correctly with negative numeric literals:

 *Data.Modular> (-10 :: ℤ7) * (11 :: ℤ7)



unMod :: (i `Mod` n) -> iSource

Extract the underlying integral value from a modular type.

toMod :: forall n i. (Integral i, SingI n) => i -> i `Mod` nSource

Wraps the underlying type into the modular type, wrapping as appropriate.

toMod' :: forall n i j. (Integral i, Integral j, SingI n) => i -> j `Mod` nSource

Wraps an integral number to a mod, converting between integral types.

data Mod i n Source

The actual type, wrapping an underlying Integeral type i in a newtype annotated with the bound.


(Integral i, SingI Nat n) => Bounded (Mod i n) 
(Integral i, SingI Nat n) => Enum (Mod i n) 
Eq i => Eq (Mod i n) 
(Integral i, SingI Nat n) => Integral (Mod i n) 
(Integral i, SingI Nat n) => Num (Mod i n) 
Ord i => Ord (Mod i n) 
(Read i, Integral i, SingI Nat n) => Read (Mod i n) 
(Integral i, SingI Nat n) => Real (Mod i n) 
Show i => Show (Mod i n) 

type (/) = ModSource

A synonym for Mod, inspired by the ℤ/n syntax from mathematics.

type = IntegerSource

A synonym for Integer, also inspired by the ℤ/n syntax.