Safe Haskell | None |
---|---|
Language | Haskell98 |
- data T a = Cons {
- modulus :: !a
- representative :: !a
- factorPrec :: Int
- (/:) :: C a => a -> a -> T a
- isCompatible :: Eq a => T a -> T a -> Bool
- maybeCompatible :: Eq a => T a -> T a -> Maybe a
- fromRepresentative :: C a => a -> a -> T a
- lift1 :: Eq a => (a -> a -> a) -> T a -> T a
- lift2 :: Eq a => (a -> a -> a -> a) -> T a -> T a -> T a
- errIncompat :: a
- zero :: C a => a -> T a
- one :: C a => a -> T a
- fromInteger :: C a => a -> Integer -> T a
Documentation
The best solution seems to let modulus
be part of the type.
This could happen with a phantom type for modulus
and a run
function like runST
.
Then operations with non-matching moduli could be detected at compile time
and zero
and one
could be generated with the correct modulus.
An alternative trial can be found in module ResidueClassMaybe.
Cons infix 7 | |
|
factorPrec :: Int Source
(/:) :: C a => a -> a -> T a infix 7 Source
r /: m
is the residue class containing r
with respect to the modulus m
isCompatible :: Eq a => T a -> T a -> Bool Source
Check if two residue classes share the same modulus
fromRepresentative :: C a => a -> a -> T a Source
errIncompat :: a Source
fromInteger :: C a => a -> Integer -> T a Source