17

Haskell 支持相互递归的 let 绑定,这很棒。Haskell 不支持相互递归的模块,这有时很糟糕。我知道 GHC 有它的.hs-boot机制,但我认为这有点小题大做。

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

我在这里错过了什么吗?Haskell 不以这种方式支持相互递归模块是否有任何重要的原因?

4

1 回答 1

21

这张已有6 年历史的功能请求票包含大量讨论,您可能已经看过了。它的要点是,就 GHC 而言,它并不完全是一个简单的改变。提出了几个具体问题:

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

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

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

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

  • 当然,还有可能出现未知的、未预料到的错误,就像任何改变 GHC 中长期假设的东西一样。即使没有对编译过程进行大量更改,目前也假定许多内容是基于每个模块进行编译的。

很多人希望看到这一点得到支持,但到目前为止,还没有人提出可能的实现或制定出一个详细的、指定良好的设计来处理上述所有棘手的极端情况。

于 2013-01-04T02:16:12.187 回答