Si vous voulez le faire en OCaml, cela est tout simplement un cas foncteur:
D'abord, vous devez définir le type de vos éléments:
module type OrderedType = sig
type t
val compare : t -> t -> int
end
Et puis vous définissez un foncteur sur ce type:
module MakeComparableSet (Ord : OrderedType) :
sig
type elt = Ord.t
type t
val empty : t
val insert : elt -> t -> t
val member : elt -> t -> bool
end = struct
type elt = Ord.t
type t
let empty = failwith "TODO"
let insert = failwith "TODO"
let member = failwith "TODO"
end
ce qui est exactement ce qui est fait here.
Vous pouvez voir un foncteur en fonction du module qui permettra de créer de nouveaux modules. Ici, le foncteur ComparableSet prend un module de signature OrderedType et retourne un module qui est un ensemble.
Regardez comment la signature 'ORD_SET' de la bibliothèque SML/NJ est définie: http://www.smlnj.org/doc/smlnj-lib/Manual/ord-set.html#ORD_SET:SIG: SPEC –
En outre, ce que vous voulez ne peut pas être écrit de manière sûre dans SML. J'ai écrit deux billets de blog liés à ce sujet: http://igstan.ro/posts/2017-04-08-a-safe-type-indexed-set-for-standard-ml.html et http: // igstan.ro/posts/2017-04-12-a-safe-type-indexed-set-for-standard-ml-errata.html. –