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

时间:2013-01-04 01:50:43

标签: haskell compiler-construction module mutual-recursion

Haskell支持相互递归的let-bindings,这很棒。 Haskell不支持相互递归的模块,这有时很糟糕。我知道GHC有its .hs-boot mechanism,但我认为这有点像黑客。

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

我在这里遗漏了什么吗? Haskell以这种方式不支持相互递归模块有什么重要的原因吗?

1 个答案:

答案 0 :(得分:21)

6-year-old feature request ticket包含了相当多的讨论,您可能已经看过了。它的要点是,就GHC而言,它并非完全是一个简单的变化。提出了一些具体问题:

  • GHC目前对编译过程中如何处理模块有很多假设,并且显着改变这些假设将大大超过透明支持相互递归模块的好处。

  • 将模块组合在一起意味着它们必须一起编译,这意味着生成单独的.hi.o文件会产生更多的重新编译和尴尬。

  • 向后兼容使用hs-boot文件的现有版本。

  • 您可能会在互相递归的模块组中跨越模块边界的相互递归绑定,这会引发涉及隐式模块级范围的任何问题(例如默认,并可能类型化类实例) )。

  • 当然,可能存在未知的,未预料到的错误,就像改变GHC中长期存在的假设一样。即使没有对编译过程进行大量更改,目前也假设许多事情都是按模块编译的。

很多人都希望看到这种支持,但到目前为止,没有人能够制作出可能的实现,或者制定出一个详细的,明确指定的设计来处理上述类型的所有繁琐的角落案例。