Почему Haskell не поддерживает взаиморекурсивные модули?

Haskell поддерживает взаимно рекурсивные let-bindings, что отлично. Haskell не поддерживает взаимно-рекурсивные модули, что иногда бывает ужасным. Я знаю, что GHC его .hs-boot механизм, но я думаю, что немного взломать.

Насколько я знаю, прозрачная поддержка взаимно-рекурсивных модулей должна быть относительно "простой", и это можно сделать точно так же, как взаимно-рекурсивные let-bindings: вместо того, чтобы брать каждый отдельный модуль в качестве единицы компиляции, я бы взял каждый сильно связанную компоненту графа зависимости модуля как единицы компиляции.

Я что-то упустил? Существует ли нетривиальная причина, почему Haskell не поддерживает взаимно-рекурсивные модули таким образом?

Ответы

Ответ 1

Этот 6-летний билет с запросом на функции содержит достаточное количество обсуждений, которые вы, возможно, уже видели. Суть его в том, что это не совсем простое изменение в отношении GHC. Несколько конкретных вопросов:

  • В настоящее время GHC имеет множество предположений о том, как модули обрабатываются во время компиляции, и существенное изменение этих допущений значительно перевешивает преимущества прозрачной поддержки взаиморекурсивных модулей.

  • Сгруппированные группы модулей означают, что они должны быть скомпилированы вместе, что означает большую перекомпиляцию и неловкость при генерации отдельных файлов .hi и .o.

  • Обратная совместимость с существующими сборками, использующими файлы hs-boot.

  • У вас есть потенциал для взаимно-рекурсивных привязок, которые пересекают границы модулей во взаимно-рекурсивной группе модулей, что приводит к возникновению проблем с чем-либо, что подразумевает неявное обладание уровня модуля (например, дефолт и, возможно, тип экземпляров класса).

  • И, конечно же, потенциал для неизвестных, непредвиденных ошибок, как и все, что изменяет давние предположения в GHC. Даже без значительных изменений в процессе компиляции многие вещи в настоящее время предполагается скомпилировать на основе каждого модуля.

Многие люди хотели бы, чтобы это поддерживалось, но до сих пор никто не производил какую-либо возможную реализацию или не разработал подробный, четко определенный дизайн, который обрабатывает все случаи с неправильным углом сортировки, упомянутые выше.