【问题标题】:Why does the Glasgow Haskell Compiler report multiple type errors here?为什么 Glasgow Haskell 编译器在这里报告多个类型错误?
【发布时间】:2018-10-11 14:42:21
【问题描述】:

考虑下面的 Haskell 代码

module TypeErrors where
f xs = [True | _ <- repeat 0]
x = (x, x)

Glasgow Haskell 编译器(版本 7.8.4)给出三种类型错误。第二个和第三个来自第 3 行暗示的无限类型。第一个是

TypeErrors.hs:2:32:
    No instance for (Num t0) arising from the literal ‘0’
    The type variable ‘t0’ is ambiguous

注释掉第 3 行后,模块按预期编译。我想更好地了解 GHC 是如何创造奇迹的。所以我的问题是:

当且仅当第 3 行存在时,为什么 GHC 反对第 2 行?

【问题讨论】:

  • 因为有多个错误...
  • 当我try your code online时,我只收到两个错误(都在第 3 行)
  • @sepp2k 这很有趣。我注意到 ideone 使用 GHC 8.0.1。我用 GHC 7.8.4 编译。也许错误(如果是一个)已修复。
  • GHC 7.8.4 已经很老了。如果有其他错误,它可能有一个关于将警告报告为错误的错误。或者它可能将其报告为警告,而您只是误读了?在正常的 GHC 操作中,该行肯定会导致有关默认不明确类型的警告。
  • 很好的问题——精确、最小、所有细节都需要我们自己尝试。我很少支持问题,但这个问题值得。

标签: haskell types functional-programming ghc


【解决方案1】:

对我来说似乎是一个错误。我可以确认您描述的行为出现在 7.8.4 中,但没有出现在 7.10.3、8.0.2、8.2.2 或 8.4.2 中,所有这些都有零或两个错误,而不是零或三个。

【讨论】:

  • 这个故事的寓意是:让你的编译器保持更新。
  • 我清楚地记得一个旧的 GHC 版本(确实可能是 7.8),其中文件中的第一个错误通常会导致稍后报告几个错误错误。在那段时间里,我学会了忽略除第一个错误之外的所有错误。这已在较新的编译器中得到修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 2015-05-22
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多