- data T a = Cons {
- modulus :: !(Maybe a)
- representative :: !a

- (/:) :: C a => a -> a -> T a
- matchMaybe :: Maybe a -> Maybe a -> Maybe a
- isCompatibleMaybe :: Eq a => Maybe a -> Maybe a -> Bool
- isCompatible :: Eq a => T a -> T a -> Bool
- lift2 :: Eq a => (a -> a -> a -> a) -> (a -> a -> a) -> T a -> T a -> T a

# Documentation

Here we try to provide implementations for `zero`

and `one`

by making the modulus optional.
We have to provide non-modulus operations for the cases
where both operands have Nothing modulus.
This is problematic since operations like '(/)'
depend essentially on the modulus.

A working version with disabled `zero`

and `one`

can be found ResidueClass.

(/:) :: C a => a -> a -> T aSource

`r /: m`

is the residue class containing `r`

with respect to the modulus `m`

matchMaybe :: Maybe a -> Maybe a -> Maybe aSource