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

标签 haskell compiler-construction module mutual-recursion

Haskell 支持相互递归的 let 绑定(bind),这很棒。 Haskell 不支持相互递归的模块,这有时很糟糕。我知道GHC有its .hs-boot mechanism ,但我认为这有点骇人听闻。

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

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

最佳答案

这个6-year-old feature request ticket包含大量讨论,您可能已经看过。它的要点是,就 GHC 而言,它并不完全是一个简单的改变。提出了几个具体问题:

  • GHC 目前有很多关于在编译期间如何处理模块的假设,并且显着改变这些假设将大大超过透明支持相互递归模块的好处。
  • 将模块组集中在一起意味着它们必须一起编译,这意味着更多的重新编译和生成单独的.hi的尴尬和 .o文件。
  • 向后兼容使用 hs-boot 的现有构建文件。
  • 您有可能在相互递归的模块组中跨越模块边界的相互递归绑定(bind),这会引发任何涉及隐式模块级范围的问题(例如默认值和可能的类型类实例)。
  • 当然,还有可能出现未知的、未预料到的错误,就像任何改变 GHC 中长期假设的东西一样。即使没有对编译过程进行大量更改,目前也假定许多内容是在每个模块的基础上编译的。

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

    关于haskell - 为什么 Haskell 不支持相互递归的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14150011/

    相关文章:

    javascript - 在 node.js 中 `module` 总是一个对象吗?

    function - 如何在 Haskell 中继续调用具有不同参数的函数直到成功

    ajax - 如何在 Elm 客户端和 Haskell (Yesod) 服务器之间发送 JSON

    haskell - 检查 Haskell 列表中是否存在元素

    C 程序运行异常缓慢

    linux - 是否有一个目录可以放置一个 d 文件,以便编译器自动包含它?

    ruby - 在 Rails 3 中扩展 Enumerable

    date - 有日期的 Haskell 库吗?

    c# - 在运行时编译代码,加载到当前 appdomain 但 Type.GetType 看不到它

    python - ds python导入数学模块