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. Servers conoscono i loro Clients).

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)

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top