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. Servers kennen ihre Clients).

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)

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top