为什么Haskell不支持相互递归的模块?

Haskell支持相互递归的let-bindings,这是非常好的. Haskell不支持相互递归的模块,这有时是可怕的.我知道GHC有its .hs-boot mechanism,但我认为这是一个黑客.

据我所知,相互递归模块的透明支持应该相对“简单”,它可以像相互递归的let-binding一样完成:而不是将每个单独的模块作为编译单元,而是将每个强大的连接组件作为编译单元的模块依赖图.

我在这里遗漏了什么吗?为什么Haskell不这样支持相互递归的模块有什么不平凡的原因吗?

这个6-year-old feature request ticket包含了大量的讨论,你可能已经看过. GHC的这个要点就是GHC不是一个简单的变化.提出的几个具体问题:

GHC目前对编译过程中如何处理模块有很多假设,而这些假设显着地超过了对相互递归模块的透明支持的好处.
>将模块集合在一起意味着它们必须被编译在一起,这意味着更多的重新编译和尴尬,生成单独的.hi和.o文件.
>向后兼容使用hs-boot文件的现有构建.
>您有可能在相互递归模块组中跨越模块边界的相互递归绑定,这会引发任何涉及隐式模块级范围(例如默认和类型类实例)的问题.
>当然,可能出现未知的,意料之外的bug,就像在GHC中改变长期假设一样.即使编译过程没有大的变化,目前假设许多事情都是按照每个模块进行编译的.

很多人都希望看到这样的支持,但到目前为止,还没有人制作出一个可能的实现,或者制定了一个详细,明确的设计来处理上述类型的所有这些虚构的角落.

代码日志版权声明:
翻译自:http://stackoverflow.com/questions/14150011/why-doesnt-haskell-support-mutually-recursive-modules

转载注明原文:为什么Haskell不支持相互递归的模块?