В Leroy paper о том, как набираются рекурсивные модули в OCaml, написано, что модули проверяются в среде, состоящей из аппроксимаций типов модулей
module rec A = ... and B = ... and C = ...
Среда {A → approx (A); B → приблизительный (B); C → approx (C)}, а затем используется для вычисления типов A, B и C.
Я заметил, что в некоторых случаях аппроксимации недостаточно хороши, и проверка typecheck не выполняется. В частности, при размещении источников компиляции в определении рекурсивного модуля проверка typecheck может завершиться неудачей, тогда как компилятор смог скомпилировать единицы компиляции отдельно.
Возвращаясь к моему первому примеру, я обнаружил, что решением было бы ввести тип A в начальную аппроксимированную среду, но затем ввести тип B в этой начальной среде, расширенной с помощью нового вычисленного типа A, и ввести C в предыдущий env с новым вычисленным типом B и т.д.
Прежде чем исследовать больше, я хотел бы знать, есть ли какая-либо предварительная работа по этому вопросу, показывающая, что такая схема компиляции для рекурсивных модулей является безопасной или небезопасной? Есть ли встречный пример, показывающий небезопасную программу, правильно напечатанную с помощью этой схемы?