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