module type SET = sig type elem type set (* empty is a function because of mutual types of sets where some elements might need to be dynamically assigned, like references *) val empty : unit -> set val insert : set -> elem -> set val remove : set -> elem -> set val member : set -> elem -> bool exception Set_is_empty end module type ORDERED = sig type elem val eq : elem -> elem -> bool val lt : elem -> elem -> bool val leq : elem -> elem -> bool end module type SET_FUNCTOR = (functor (Element : ORDERED) -> SET with type elem = Element.elem) module type GENERATOR = sig type p module O : ORDERED val generate_list : int -> O.elem list (* feel free to use it as you wish, but my intention was to use p as, for example, Random | Sorded | Reverse | ... *) val gen_parametrised_list : p -> int -> O.elem list end