module type Comparable = sig
type t
val compare : t -> t-> int
end
definiert rewriten werden. Innerhalb einer Schnittstelle (z. B. einer .mli
-Datei) ist es ein Versprechen, dass die Implementierung (.ml
) dieselbe Modultypdefinition enthält.
module Comparable : sig
type t
val compare : t -> t-> int
end
in einer Schnittstelle ist ein Versprechen, ein Modul des gleichen Typs bereitzustellen. Dies entspricht
module Comparable : Comparable
(vorausgesetzt, der Modultyp ist tatsächlich definiert).Es besagt, dass das entsprechende .ml
ein Submodul mit dem Namen Comparable
enthält.
Welche der zwei Sie in Sie setzen sollten .mli
hängt davon ab, was Sie verspricht zu machen. Beide haben ihren Nutzen.
Modultypdefinitionen werden häufig in Schnittstellen gefunden, wenn sie als Argumente für Funktoren benötigt werden. In der Tat ist Ihr Modultyp Comparable
gleich Map.OrderedType
, der Typ des Arguments des Funktors Map.Make
.
Ein Anwendungsfall von Submodulen wie oben ist bieten etwas, das als Argument für einen Funktor verwendet werden kann. Zum Beispiel könnte ein .mli
wie folgt aussehen:
type stuff = ...
val fancy : ... (* some operations on stuff *)
module Comparable : Comparable with type t=stuff
In dieser Form wäre es die Art stuff
verwendbar als Schlüsseltyp einer Karte machen.
Das heißt, wenn Ihr Beispiel das vollständige Beispiel der realen Welt ist, dann vermute ich, dass Sie die Modultypdefinition wollen, nicht das Submodul: Das Submodul wäre nicht sehr nützlich; Sie haben keine Operation, um etwas vom Typ t
zu konstruieren.