In Leroy's paper su come moduli ricorsiva vengono digitati in OCaml, è scritto che i moduli vengono controllati in un ambiente fatto di approssimazioni di tipi di moduli:battitura moduli ricorsive
module rec A = ... and B = ... and C = ...
un ambiente {A -> circa (A); B -> circa (B); C -> approx (C)} viene prima creato e quindi utilizzato per calcolare i tipi di A, B e C.
Ho notato che, in alcuni casi, le approssimazioni non sono abbastanza buone, e il typechecking fallisce. In particolare, quando si inseriscono le origini delle unità di compilazione in una definizione di modulo ricorsiva, il typechecking può fallire mentre il compilatore è in grado di compilare le unità di compilazione separatamente.
Tornando al mio primo esempio, ho trovato che una soluzione sarebbe quella di digitare A nell'ambiente approssimato iniziale, ma poi di digitare B in quell'ambiente iniziale esteso con il nuovo tipo calcolato di A, e di digitare C in l'env precedente con il nuovo tipo di B calcolato e così via.
Prima di indagare di più, vorrei sapere se c'è qualche lavoro precedente su questo argomento, dimostrando che tale schema di compilazione per moduli ricorsivi è sicuro o non sicuro? C'è un contro-esempio che mostra un programma non sicuro correttamente digitato con questo schema?
Una domanda molto interessante, davvero. Si noti che la soluzione proposta ignora che il tipo di A può dipendere da quello di B e C, se così non fosse, non ci sarebbe motivo di digitarli insieme (al contrario dell'ordine delle dipendenze). – Ingo
No, in realtà, il tipo di A può dipendere da B e C, ma suppongo che l'approssimazione di B e C sia sufficiente in tal caso.La mia domanda viene da un esempio reale, l'ho risolto scrivendo una patch con questa soluzione nel compilatore e il programma era sicuro (perché composto da unità di compilazione con tipi ricorsivi), ma voglio sapere se la patch è sicura nel caso generale. –