module type Comparable = sig
type t
val compare : t -> t-> int
end
définit un type de module. Dans une interface (par exemple un fichier .mli
), il est promis que l'implémentation (.ml
) contient la même définition de type de module.
module Comparable : sig
type t
val compare : t -> t-> int
end
dans une interface est une promesse de fournir un module de ce même type. Il serait équivalent à
module Comparable : Comparable
(en supposant que le type de module est bien défini).Il indique que le .ml
correspondant contient un sous-module nommé Comparable
.
Lequel des deux que vous devriez mettre .mli
dépend de ce que vous voulez faire. Les deux ont leurs utilisations.
Les définitions de type de module sont généralement trouvées dans les interfaces si elles sont nécessaires en tant qu'arguments aux foncteurs. En effet votre type de module Comparable
est égal à Map.OrderedType
, le type de l'argument du foncteur Map.Make
.
Un cas d'utilisation des sous-modules comme ci-dessus est de fournir quelque chose qui peut être utilisé comme un argument à un foncteur. Par exemple, un .mli
pourrait ressembler à ceci: Sous cette forme
type stuff = ...
val fancy : ... (* some operations on stuff *)
module Comparable : Comparable with type t=stuff
il serait le type stuff
utilisable comme le type de clé d'une carte. Cela dit, si votre exemple est l'exemple du monde réel complet, alors je suppose que vous voulez la définition du type de module, pas le sous-module: Le sous-module ne serait pas très utile; vous n'avez aucune opération pour construire quoi que ce soit de type t
.