gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:03:18 24 4
gpt4 key购买 nike

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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com