En Leroy's paper sobre cómo los módulos recursiva se escriben en OCaml, está escrito que los módulos se comprueban en un entorno hecho de aproximaciones de los tipos de módulos:escribiendo módulos recursivas
module rec A = ... and B = ... and C = ...
Un entorno {A -> aprox (A); B -> aproximadamente (B); C -> approx (C)} primero se construye, y luego se usa para calcular los tipos de A, B y C.
Me di cuenta de que, en algunos casos, las aproximaciones no son lo suficientemente buenas y la comprobación de tipos falla. En particular, cuando se colocan fuentes de unidades de compilación en una definición de módulo recursivo, la comprobación de tipo puede fallar, mientras que el compilador pudo compilar las unidades de compilación por separado.
Volviendo a mi primer ejemplo, encontré que una solución sería escribir A en el entorno aproximado inicial, pero luego escribir B en ese entorno inicial extendido con el nuevo tipo calculado de A, y escribir C en el env anterior con el nuevo tipo computado de B, y así sucesivamente.
Antes de investigar más, me gustaría saber si hay algún trabajo previo sobre este tema, mostrando que dicho esquema de compilación para módulos recursivos es seguro o inseguro? ¿Hay un contraejemplo que muestre un programa inseguro correctamente escrito con este esquema?
Una pregunta muy interesante, de hecho. Tenga en cuenta que su solución propuesta ignora que el tipo de A puede depender de la de B y C, si no fuera así, no habría ninguna razón para escribirlos juntos (a diferencia de la orden de dependencia). – Ingo
No, en realidad, el tipo de A puede depender de B y C, pero supongo que la aproximación de B y C es suficiente en ese caso.Mi pregunta proviene de un ejemplo real, lo resolví escribiendo un parche con esta solución en el compilador, y el programa era seguro (porque estaba compuesto por unidades de compilación con tipos recursivos), pero quiero saber si el parche está seguro en el compilador. caso general. –