Sto cercando di capire una cosa specifica sui moduli OCaml e la loro compilazione:ridondanza nella dichiarazione del tipo di OCaml (ml/MLI)
io sono costretto a ridichiarare tipi già dichiarati in .mli
all'interno delle specifiche .ml
implementazioni?
Tanto per fare un esempio:
(* foo.mli *)
type foobar = Bool of bool | Float of float | Int of int
(* foo.ml *)
type baz = foobar option
Questo, secondo il mio normale modo di pensare interfacce/implementazioni, dovrebbe essere ok, ma si dice
Error: Unbound type constructor foobar
durante il tentativo di compilare con
ocamlc -c foo.mli
ocamlc -c foo.ml
Ovviamente l'errore scompare se dichiaro foobar
anche all'interno di foo.ml
ma sembra un modo complesso dato che devo tenere sincronizzate le cose ad ogni cambio.
C'è un modo per evitare questa ridondanza o sono costretto a ridenominare i tipi ogni volta?
Grazie in anticipo
Non penso ci debbano essere limitazioni nel consentire ad un file '.ml' di dedurre i tipi decritti in accoppiati' .mli'. Da quello che capisco l'effettiva implementazione __forces la ridondanza__ ma anche che __le due firme devono essere uguali__ quindi questo è effettivamente il raddoppio delle stesse dichiarazioni. Ecco perché ho pensato che dovrebbe essere a conoscenza di queste dichiarazioni senza doverle copiare e incollare. Secondo me, l'algoritmo di inferenza del tipo non avrebbe problemi. – Jack
Non impone la ridondanza né richiede che le firme siano identiche, solo che la dichiarazione nel file ml deve essere uguale o più specifica della dichiarazione mli. Il punto del mli è definire cosa è visibile nell'interfaccia, in quanto tale è possibile scegliere di non esporre il tipo (nel qual caso non è nel file mli) o si può scegliere di esporre che c'è un tipo, ma non come è usato (nel qual caso le dichiarazioni di tipo sono diverse). Ovviamente nella tua situazione avrebbe senso che il compilatore assuma solo il tipo dato che è completamente definito nel mli. –
@Niki non c'è ridondanza forzata nelle dichiarazioni * value * (che sono facoltative nel .ml), ed in pratica è qui che entra in gioco "almeno tanto quanto". Ma nel 99% dei casi un * manifest type * dichiarato in un'interfaccia è identica alla definizione del tipo nell'implementazione. Questo è ridondante e irritante, ma come progettista di linguaggi ho riflettuto a fondo su questo problema e non ho elaborato una proposta che ritengo sia di principio sia di gran lunga migliore di OCaml. –