module ZnZ (N : sig val n : int end) : Poly.ANNEAU = struct type t = int let n = if N.n > 0 then N.n else failwith "n <= 0" let zero = 0 let unit = 1 let plus x y = (x + y) mod n let symm x = (0 - x) mod n let mult x y = (x * y) mod n let equal = (=) (* invariant: les éléments de type t sont entre 0 et k *) let tostring = string_of_int end;;
module Z7Z = ZnZ (struct let n = 7 end);; module Z13Z = ZnZ (struct let n = 13 end);; (* la définition suivante échoue, comme attendue *) (* let _ = Z7Z.symm Z13Z.unit;; *)
Le code suivant doit alors échouer au typage:
let _ = Z7Z.symm Z13Z.unit;;