Perché il requisito per le firme nei moduli mutuamente ricorsive in OCaml?
-
13-10-2019 - |
Domanda
Quando si utilizza reciprocamente definizioni ricorsive modulo in OCaml, è necessario dare le firme, anche nel file .ml
. Si tratta di un fastidio dove voglio anche esporre una data interfaccia dalla .mli
, come finisco per ripetere due volte la firma. : (
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
Questa è una rozza approssimazione di quello che sto facendo (tipo Client
oggetti conoscono la Server
che li istanziato. Server
s conoscono i loro Client
s).
Naturalmente, le firme si ripetono nel .mli
. Perché questo è necessario?
. (Nota: non mi lamento, ma in realtà vogliono sapere se c'è un tipo di teoria o "difficile problema del compilatore" ragione -related per questo)
Soluzione
La mia ipotesi: per compilare i moduli ricorsive compilatore deve annotazioni di tipo per l'attuazione. Nel file di MLI (se si utilizza qualsiasi) tipi di questi moduli possono essere ulteriormente ristretta o nascosta del tutto, quindi nel caso generale non è ragionevole per il compilatore aspettarsi di trovare tipi utili a WRT MLI risolvere tipo-ricorsione.
Altri suggerimenti
Per quanto ne so, non c'è modo intorno ad esso presente. Ad un livello molto alto, per quanto riguarda il compilatore è interessato, la firma tipo di cliente è incompleto finché non conosce la firma tipo di server, e viceversa. In linea di principio, c'è un modo per aggirare questo: il compilatore potrebbe attraversare riferimento i file .mli al momento della compilazione. Ma questo approccio ha degli svantaggi: si mescola alcune delle responsabilità del compilatore e il linker, e rende la compilazione modulare (no pun intended) più difficile
.Se siete interessati, vi consiglio proposta originale di Xavier Leroy per moduli ricorsivi.