Haskell支持相互递归的let-bindings,这很棒。 Haskell不支持相互递归的模块,这有时很糟糕。我知道GHC有its .hs-boot
mechanism,但我认为这有点像黑客。
据我所知,对相互递归模块的透明支持应该相对“简单”,并且可以完全完全完成相互递归的let-bindings:而不是将每个单独的模块作为一个编译单元,我将模块依赖图的每个强连接组件作为编译单元。
我在这里遗漏了什么吗? Haskell以这种方式不支持相互递归模块有什么重要的原因吗?
答案 0 :(得分:21)
此6-year-old feature request ticket包含了相当多的讨论,您可能已经看过了。它的要点是,就GHC而言,它并非完全是一个简单的变化。提出了一些具体问题:
GHC目前对编译过程中如何处理模块有很多假设,并且显着改变这些假设将大大超过透明支持相互递归模块的好处。
将模块组合在一起意味着它们必须一起编译,这意味着生成单独的.hi
和.o
文件会产生更多的重新编译和尴尬。
向后兼容使用hs-boot
文件的现有版本。
您可能会在互相递归的模块组中跨越模块边界的相互递归绑定,这会引发涉及隐式模块级范围的任何问题(例如默认,并可能类型化类实例) )。
当然,可能存在未知的,未预料到的错误,就像改变GHC中长期存在的假设一样。即使没有对编译过程进行大量更改,目前也假设许多事情都是按模块编译的。
很多人都希望看到这种支持,但到目前为止,没有人能够制作出可能的实现,或者制定出一个详细的,明确指定的设计来处理上述类型的所有繁琐的角落案例。