module <name> =
struct
..
end;;
module type <name> =
struct (* should have been sig *)
..
end;;
Antwort
Die erste deklariert ein Modul und die zweite deklariert einen Modultyp (aka eine Signatur). Ein Modultyp enthält die Deklarationen type
und val
, während ein Modul Definitionen enthalten kann (z. B. let
Bindungen). Sie können eine Signatur verwenden, um den Typ eines Moduls zu beschränken, ähnlich wie bei einer Funktion. Zum Beispiel
module type T = sig
val f : int -> int
end
module M : T = struct
let f x = x + 1
let g x = 2 * x
end
Jetzt haben wir
# M.f 0 ;;
- : int = 1
# M.g 0 ;;
Error: Unbound value M.g
M.g
ungebunden ist, weil es durch die Unterschrift T
versteckt ist.
Eine andere gängige Methode, Modultypen zu verwenden, sind Argumente und Rückgabewerte von Funktoren. Zum Beispiel nimmt die Map.Make
Funktors in the standard library ein Modul mit Unterschrift Map.OrderedType
und schafft ein Modul mit Unterschrift Map.S
P.S. Beachten Sie, dass in der Frage ein Fehler vorliegt. Ein Modultyp wird unter Verwendung erklärt
module type <name> = sig
...
end
Modultyp ein Modul beschreiben. Es ist das gleiche wie der Unterschied zwischen .ml und .mli
A Struktur (geschrieben struct … end
) ist ein Bündel von Definitionen. Jedes Objekt in der Sprache kann in einem Modul definiert werden: Kernwerte (let x = 2 + 2
), Typen (type t = int
), Module (module Empty = struct end
), Signaturen (module type EMPTY = sig end
) usw. Module sind eine Verallgemeinerung von Strukturen: eine Struktur ist ein Modul, und so ist ein Funktor (denken Sie an es als eine Funktion, die ein Modul als Argument nimmt und ein neues Modul zurückgibt). Module sind wie Kernwerte, leben aber eine Ebene darüber: Ein Modul kann alles enthalten, während ein Kernwert nur andere Kernwerte enthalten kann¹.
A Unterschrift (geschrieben) ist ein Bündel von Spezifikationen (in einigen Sprachen verwenden den Begriff Erklärung). Jedes Objekt in der Sprache kann in einem Modul angegeben werden: Kernwerte (val x : int
), Typen (type t = int
), Module (module Empty : sig end
), Signaturen (module type EMPTY = sig end
) usw. Modultypen Signaturen verallgemeinern: Ein Modultyp spezifiziert ein Modul, und Ein Modultyp, der zufälligerweise eine Struktur angibt, wird als Signatur bezeichnet. Modultypen sind für Module, welche gewöhnlichen Typen Kernwerte sind.
Kompilierungseinheiten (.ml
Dateien) sind Strukturen. Schnittstellen (.mli
Dateien) sind Signaturen.
Also module Foo = struct … end
definiert ein Modul namens Foo
, die eine Struktur ist. Dies ist analog zu let foo = (1, "a")
, die einen Wert definiert, der foo
genannt wird, der zufällig ein Paar ist. Und module type FOO = sig … end
(Hinweis: sig
, nicht struct
) definiert einen Modultyp namens FOO
, die eine Signatur ist.Dies ist analog zu type foo = int * string
, das einen Typ namens foo
definiert, der zufällig ein Produkttyp ist.
¹ Dies ist in der Tat nicht mehr wahr, da OCaml 3.12 erstklassige Module eingeführt hat, aber es ist nahe genug für eine einführende Präsentation.
- 1. Sollte jemals etwas zwischen dem Ende</body> Tag und dem Ende sein</html> Tag
- 2. C-Array-Initialisierung am Ende der Struktur
- 3. Unterschied zwischen Javascript Iffy Struktur
- 4. Unterschied zwischen <> und =
- 5. Was macht dieser Ruby-Code ?: def self.metaclass; Klasse << selbst; selbst; Ende; Ende
- 6. Unterschied zwischen `<% #` und `<% =` und einer asp.net ascx Datei?
- 7. "Covariance" der System.Nullable <> Struktur
- 8. C-Struktur und C++ Struktur
- 9. In ASP.Net, was ist der Unterschied zwischen <% = und <% #
- 10. Unterschied zwischen Initialisierungen stringstream.str (a_value) und string << a_value
- 11. Unterschied zwischen <acronym> und <abbr>?
- 12. Was ist der Unterschied zwischen Ofstream "<<" und Schreiben
- 13. Unterschied zwischen <T> und <E>
- 14. Was ist der Unterschied zwischen <%# %> und <%= %>?
- 15. Was ist der Unterschied zwischen <% %> und <%=%>?
- 16. Was ist der Unterschied zwischen << und + =?
- 17. Unterschied zwischen String-Operatoren + und << in Ruby
- 18. Fehler: flexibel Arraymitglied nicht am Ende der Struktur
- 19. Was zwischen tun Vektor <vector<T...> der Unterschied> und Vektor <vector<T> ...>
- 20. Unterschied zwischen Klasse und Klasse <?>
- 21. Umwandeln einer Swift-Struktur in UnsafeMutablePointer <Void>
- 22. Was ist der Unterschied zwischen Punkt-zu-Punkt- und Ende-zu-Ende-Sicherheit?
- 23. Was ist der Unterschied zwischen Ende und Ende Ereignisse in Node-Streams
- 24. dplyr: Unterschied der Werte zwischen Ende Jahr und starten Jahr
- 25. Was ist der Unterschied zwischen der CvCapture-Struktur und der VideoCapture-Struktur?
- 26. Unterschied zwischen Struktur und Klasse in Common Lisp
- 27. Unterschied zwischen Struktur und Klasse, wenn Vorlage Meta-Programmierung
- 28. Was ist der Unterschied zwischen Struktur und Klasse
- 29. Was ist der Unterschied zwischen Enum-Struktur und Enum-Klasse?
- 30. Regex Differenz zwischen Wortgrenze Ende und Kanten
Haben Sie versucht, Ihren 'Modultyp Name = struct ... end' zu kompilieren, bevor Sie gefragt werden? –
Ich wollte nur ein Beispiel illustrieren. Ich arbeitete an einem großen Modul und erkannte, dass ich die Leute nicht von der eigentlichen Frage ablenken wollte. –