Warum die Voraussetzung für Signaturen in für beide Seiten rekursive Module in OCaml?
-
13-10-2019 - |
Frage
Bei der Verwendung von für beiden Seiten rekursive Moduldefinitionen in OCaml, ist es notwendig, Unterschriften zu geben, auch in der .ml
Datei. Dies ist ein Ärgernis, wo ich will auch eine bestimmte Schnittstelle aus dem .mli
belichten, wie ich zweimal die Unterschrift Wiederholung enden. : (
module rec Client : sig
type ('serv,'cli) t
(* functions ... *)
end = struct
type ('serv,'cli) t =
{ server: ('serv,'cli) Server.t
; (* other members ... *)
}
end
and Server : sig
type ('serv,'cli) t
(* functions ... *)
end = struct
type ('serv,'cli) t =
{ mutable clients: ('serv,'cli) Client.t list
; mutable state: 'serv
}
(* functions again ... *)
end
Dies ist eine grobe Annäherung an, was ich tue (Client
Typ Objekte kennen die Server
, die sie instanziiert. Server
s kennen ihre Client
s).
Natürlich werden die Signaturen in der .mli
wiederholt. Warum ist das notwendig?
. (Anmerkung: Ich beklage mich nicht, aber eigentlich will wissen, ob es eine Art-Theorie ist oder „hart Compiler Problem“ -bezogene Grund hierfür)
Lösung
Meine Vermutung: um rekursive Module zu kompilieren Compiler Typenannotationen für die Umsetzung benötigt. In mli Dateitypen dieser Module (und wenn Sie verwenden) kann weiter ganz eingeschränkt oder ausgeblendet werden, so dass im Allgemeinen Fall ist es nicht sinnvoll ist, für Compiler zu erwarten geeignete Typen in mli WRT Auflösungstyp-Rekursion zu finden.
Andere Tipps
Soweit ich weiß, gibt es keinen Weg, um es diesen. Bei einem sehr hohen Niveau, so weit wie der Compiler betrifft, so ist die Art Unterschrift des Kunden unvollständig, bis er die Art Signatur von Server und umgekehrt weiß. Im Prinzip ist es eine Möglichkeit, dies zu umgehen: die Compiler Ihre .mli Dateien während der Kompilierung Referenz überqueren können. Aber dieser Ansatz hat Nachteile: es einige der Aufgaben des Compilers mischt und den Linken und macht modulare Zusammenstellung (kein Wortspiel beabsichtigt) schwieriger
.Wenn Sie daran interessiert sind, empfehle ich Xavier Leroy ursprünglichen Vorschlag für rekursive Module.