¿Por qué Haskell no admite módulos recursivos entre sí?
compiler-construction module (1)
Haskell admite enlaces mutuamente recursivos, lo cual es genial. Haskell no admite módulos recursivos entre sí, lo que a veces es terrible. Sé que GHC tiene su mecanismo .hs-boot
, pero creo que es un poco pirateado.
Por lo que sé, el soporte transparente para los módulos recursivos entre sí debería ser relativamente "simple", y se puede hacer exactamente igual que los enlaces recursivos recíprocos: en lugar de tomar cada módulo separado como una unidad de compilación, tomaría todos los componentes fuertemente conectados del gráfico de dependencias del módulo como unidad compiladora.
¿Me estoy perdiendo de algo? ¿Hay alguna razón no trivial por la que Haskell no admita módulos recursivos entre sí de esta manera?
Este boleto de solicitud de características de 6 años contiene una buena cantidad de discusión, que tal vez ya haya visto. La esencia de esto es que no es un cambio completamente simple en lo que respecta a GHC. Algunas cuestiones específicas planteadas:
Actualmente, GHC tiene una gran cantidad de suposiciones acerca de cómo se procesan los módulos durante la compilación, y cambiar esas suposiciones de manera significativa sería mucho mayor que los beneficios del soporte transparente para módulos recursivos mutuos.
Agrupar grupos de módulos juntos significa que deben compilarse juntos, lo que significa más recompilación y torpeza al generar archivos
.hi
y.o
separados.Compatibilidad con versiones anteriores de compilaciones existentes que utilizan archivos
hs-boot
.Usted tiene el potencial para los enlaces recursivos recíprocos que cruzan los límites de los módulos en un grupo de módulos recursivos recíprocos, lo que plantea problemas con cualquier cosa que implique un alcance implícito, a nivel de módulo (como las instancias predeterminadas y posiblemente de clase de tipo).
Y, por supuesto, el potencial de errores desconocidos y no anticipados, como con cualquier cosa que altere las suposiciones de larga data en GHC. Incluso sin cambios masivos en el proceso de compilación, actualmente se asume que muchas cosas se compilan por módulo.
A muchas personas les gustaría que esto sea compatible, pero hasta ahora nadie ha producido una posible implementación o ha desarrollado un diseño detallado y bien especificado que maneje todos los casos complicados de las esquinas del tipo mencionado anteriormente.