2017-12-14 10 views
1

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 wird
module OK2 (T: T1) : (T2 with type t = [ `X | `Y of T.t]) = struct 
    type t = X | Y of T.t 
end 

Antwort

2

Bei Modul Einschränkung with type t = ..., können Sie nicht Typdefinitionen schreiben, aber Ausdrücke eingeben.

X | Y of T.t ist ein rhs einer Variant Typdefinition, daher wird es als Syntaxfehler abgelehnt. Auf der anderen Seite ist [ `X | `Y of T.t] ein Typausdruck.

Wenn Sie sich über den Unterschied zwischen den normalen Varianten und den polymorphen Varianten nicht sicher sind, überprüfen Sie bitte die OCaml-Bücher oder das Referenzhandbuch.

Was Sie schreiben wollen

module type T3 = sig 
    type t' 
    type t = X | Y of t' 
end 

module KOX (T: T1) : (T3 with type t' := T.t) = struct 
    type t = X | Y of T.t 
end 
+0

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

+1

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

+0

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