Funktoren in OCaml verstehen

8

Ich bin ziemlich fest mit dem folgenden Funktorproblem in OCaml. Ich füge einen Teil des Codes ein, damit Sie es verstehen. Grundsätzlich

Ich habe diese zwei Module in pctl.ml definiert:

%Vor%

und der folgende Funktor:

%Vor%

Um diese Module tatsächlich zu verwenden, habe ich ein neues Modul direkt in einer Datei namens prism.ml :

definiert %Vor%

Von einer dritten Quelle ( formulas.ml ) habe ich den Funktor mit Prism modul:

benutzt %Vor%

Und schließlich von main.ml

%Vor%

und kompiliert gibt den folgenden Fehler

  

Fehler: Dieser Ausdruck hat den Typ Prism.state = Prism.value array          Es wurde jedoch ein Ausdruck vom Typ Formulas.PrismPctl.s

erwartet

Von dem, was ich verstehen kann, gibt es eine Art schlechtes Aliasing der Namen, sie sind gleich (da value array der Typ ist, der als t definiert ist und M with type s = P.t im Funktor verwendet wird), aber der Typchecker tut das nicht halte sie nicht für gleich.

Ich verstehe wirklich nicht, wo das Problem ist, kann mir jemand helfen?

Vielen Dank im Voraus

    
Jack 25.07.2010, 01:12
quelle

2 Antworten

6

(Du postest nicht kompilierbaren Code. Das ist eine schlechte Idee, weil es es Leuten erschweren kann, dir zu helfen, und weil es manchmal genug ist, dein Problem auf ein einfaches Beispiel zu reduzieren. Aber ich glaube, ich sehe dein Schwierigkeit sowieso.)

Innerhalb von formulas.ml kann Ocaml das PrismPctl.s = Pctl.Make(Prism).t = Prism.t sehen; Die erste Gleichheit stammt aus der Definition von PrismPctl , und die zweite Gleichheit stammt aus der Signatur von Pctl.Make (speziell das with type s = P.t -Bit).

Wenn Sie keine mli -Datei für Formulas schreiben, sollte Ihr Code kompiliert werden. Das Problem muss also sein, dass die Datei .mli , die Sie geschrieben haben, die richtige Gleichheit nicht erwähnt. Sie zeigen Ihre .mli -Dateien nicht (Sie sollten, sie sind Teil des Problems), aber vermutlich haben Sie

geschrieben %Vor%

Das ist nicht genug: wenn der Compiler main.ml kompiliert, weiß er nichts über PrismPctl , das nicht in formulas.mli angegeben ist. Sie müssen entweder

angeben %Vor%

oder, vorausgesetzt, Sie haben with type s = P.t in die Signatur von Make in pctl.mli

eingefügt %Vor%     
Gilles 25.07.2010, 19:37
quelle
2

Das ist ein Problem, dem ich auch begegnet bin, als ich mehr darüber gelernt habe. Wenn Sie den Funktor erstellen, legen Sie die Signatur des Funktors offen, in diesem Fall M . Es enthält einen abstrakten Typ s , der durch den Funktor parametrisiert wird, und alles Spezifische wird nicht nach außen offengelegt. Wenn Sie also auf ein Datensatzelement von s (wie in sys_state ) zugreifen, führt dies zu einem Typfehler, wie Sie bereits festgestellt haben.

Der Rest sieht gut aus. Es ist definitiv schwierig, mit Funktoren richtig umzugehen, aber denken Sie daran, dass Sie nur Instanzen des Typs, der vom Funktor parametrisiert wurde, über die Schnittstelle / Signatur, die vom Funktor verfügbar gemacht wird, manipulieren können.

    
nlucaroni 25.07.2010 06:21
quelle

Tags und Links