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.
Constructors
Consinfix 7modulus :: !arepresentative :: !a
Instances7Eq, Read, Show, C, …
Eq a => Eq (T a)Defined in numeric-prelude-0.4.4 · Number.ResidueClass.Check(Read a, C a) => Read (T a)Defined in numeric-prelude-0.4.4 · Number.ResidueClass.CheckShow a => Show (T a)Defined in numeric-prelude-0.4.4 · Number.ResidueClass.Check(Eq a, C a) => C (T a)Defined in numeric-prelude-0.4.4 · Number.ResidueClass.Check(Eq a, C a) => C (T a)Defined in numeric-prelude-0.4.4 · Number.ResidueClass.Check(Eq a, C a) => C (T a)Defined in numeric-prelude-0.4.4 · Number.ResidueClass.CheckC a => C (T a)Defined in numeric-prelude-0.4.4 · Number.ResidueClass.Check