module type ME = sig type 'a t val vide : unit -> 'a t val inserer : 'a -> 'a t -> 'a t val compter : 'a -> 'a t -> int val retirer : 'a -> 'a t -> 'a t exception Element_absent end module Util_ME = functor (M : ME) -> struct let vide = M.vide let inserer = M.inserer let compter = M.compter let retirer = M.retirer let present = fun x e -> M.compter x e > 0 let rec eliminer = fun x e -> try let e' = M.retirer x e in eliminer x e' with | M.Element_absent -> e end (*** #load "multiens.cmo";; #load "multiens2.cmo";; ***) module M = Util_ME(Multiens) let e1 = M.inserer 'a' (M.inserer 'b' (M.inserer 'a' (M.vide ()))) let () = print_int (M.compter 'a' e1) let () = print_int (M.compter 'b' e1) let e2 = M.eliminer 'a' e1 let () = print_int (M.compter 'a' e2) let () = print_int (M.compter 'b' e2) let () = print_newline () module M' = Util_ME(Multiens2) let e1 = M'.inserer 'a' (M'.inserer 'b' (M'.inserer 'a' (M'.vide ()))) let () = print_int (M'.compter 'a' e1) let () = print_int (M'.compter 'b' e1) let e2 = M'.eliminer 'a' e1 let () = print_int (M'.compter 'a' e2) let () = print_int (M'.compter 'b' e2)