Ich versuche, Module/Funktoren zu verwenden, um eine allgemeinere Code-Design zu haben. Zur Vereinfachung habe ich zwei Schnittstellen:Variant Typen als Modul/Funktor Signatur Einschränkungen in ocaml
module type T1 = sig type t end;;
module type T2 = sig type t end;;
und ich möchte so instanziiert T2.t
mit einer Variante Typ basierend auf T1.t
.
(* simple example, this one is accepted *)
module OK (T: T1) : (T2 with type t = T.t) = struct type t = T.t end;;
(* using a variant type, this one is rejected *)
module KO (T: T1) : (T2 with type t = X | Y of T.t) = struct
type t = X | Y of T.t
end
Im letzteren, erhalte ich folgende Fehler:
Unbound module X
Syntax error inside `module' after unclosed (, expected `.'
Allerdings, wenn ich polymorphe Varianten verwenden, so scheint es, in Kauf genommen werden:
module OK2 (T: T1) : (T2 with type t = [ `X | `Y of T.t]) = struct
type t = [ `X | `Y of T.t ]
end
aber ich nicht eindeutig verstehen warum. Was ist der richtige Weg, um solche Einschränkungen mit Varianten zu verwenden?
PS: beachten Sie, dass auch dieser
abgelehnt wirdmodule OK2 (T: T1) : (T2 with type t = [ `X | `Y of T.t]) = struct
type t = X | Y of T.t
end
Danke auch sein mag, ich werde versuchen, es zu lesen. Ich habe mehrere Quellen für Informationen über normale/polymorphe Varianten gefunden, aber es ist schwierig zu erkennen, welcher der aktuellsten ist. Hast du einen zu empfehlen? – Vinz
Das OCaml Handbuch wäre die maßgebliche Quelle für aktuelle Informationen: https://caml.inria.fr/pub/docs/manual-ocaml/lablexamples.html#sec46 – glennsl
Sie haben sowohl Vor- als auch Nachteile, und es Deshalb existieren beide in der Sprache. Wenn Sie sich nicht sicher sind, bleiben Sie bei den normalen Varianten. – camlspotter