Haskell类型错误消息

Haskell类型错误消息,haskell,types,error-handling,Haskell,Types,Error Handling,我对Haskell生成类型错误消息的方式感兴趣。我特别感兴趣的是它建议用户按顺序修复程序表达式的方式 让错误消失。例子应该更清楚地说明这一点。考虑第一个例子。 main = zprint 2 zprint x = putStrLn x 相应的错误消息为: No instance for (Num String) arising from the literal `2' Possible fix: add an instance declaration for (Num String) In

我对Haskell生成类型错误消息的方式感兴趣。我特别感兴趣的是它建议用户按顺序修复程序表达式的方式 让错误消失。例子应该更清楚地说明这一点。考虑第一个例子。

main = zprint 2
zprint x = putStrLn x
相应的错误消息为:

No instance for (Num String)
  arising from the literal `2'
Possible fix: add an instance declaration for (Num String)
In the first argument of `zprint', namely `2'
In the expression: zprint 2
In an equation for `main': main = zprint 2
我解释这一点的方式是,编译器告诉我应该修复传递的参数
2
,或者整个函数调用
zprint 2
,甚至整个
main=zprint 2
,但它确实报告了
putStrLn
,说我用错了它,应该使用其他函数。同样,我们有以下示例:

main = zprint 2
idn x = x
zprint x = putStrLn (idn x)
信息是一样的:

No instance for (Num String)
  arising from the literal `2'
Possible fix: add an instance declaration for (Num String)
In the first argument of `zprint', namely `2'
In the expression: zprint 2
In an equation for `main': main = zprint 2

但是,我们也可以将第二行更改为
idnx=showx
,程序现在已经输入良好。因此,我可以通过Haskell列出这些表达式的方式来查看模式,但我希望看到实际的算法,如果它写在某个地方,而不是编译器源代码。请注意,我不是Haskell方面的专家,更像是一个OCaml人员。我使用的GJC版本是7.4.1。

Haskell使用的是a的修改形式,GHC使用的是的修改版本,以便键入检查并生成错误消息

关于Haskell是如何进行类型检查的,还有很多冗长的讨论


我不能保证这些资源是超级可访问的,但那是因为类型推断并不容易,类型系统通常需要一点研究才能完全掌握,GHC使用Haskell的复杂类型系统来生成您看到的错误消息。

Haskell使用一种经过修改的,GHC使用的修改版本用于类型检查和生成错误消息

关于Haskell是如何进行类型检查的,还有很多冗长的讨论

我不能保证这些资源是超级可访问的,但那是因为类型推断并不容易,类型系统通常需要一点研究才能完全掌握,GHC使用Haskell的复杂类型系统生成您看到的错误消息

因此,我可以通过Haskell列出这些表达式的方式来查看模式,但我希望看到实际的算法,如果它写在某个地方,而不是编译器源代码

没有一个正式的错误报告算法,它实际上是编译器实现的工程细节,不同的Haskell编译器采用不同的方法。因此,我担心,如果你想了解GHC的细节,唯一的办法就是在编译器或TracWiki上阅读

正如BenjaminKovach所说,算法和错误报告与您在vanilla Hindley Milner中所做的没有显著差异。typechecker跟踪位置信息,当unifier无法找到解决方案时,它会报告生成失败约束的术语的来源。一个次要细节是,它还尝试对错误消息类型中的自由变量应用可用的部分解决方案

类型系统本身是HM(X)的演变(参见类型和编程语言高级主题第10章)。概述typechecker的最新论文是,它或多或少是如何在最新的GHC SAN中工作的,其中包括一些egde工作

因此,我可以通过Haskell列出这些表达式的方式来查看模式,但我希望看到实际的算法,如果它写在某个地方,而不是编译器源代码

没有一个正式的错误报告算法,它实际上是编译器实现的工程细节,不同的Haskell编译器采用不同的方法。因此,我担心,如果你想了解GHC的细节,唯一的办法就是在编译器或TracWiki上阅读

正如BenjaminKovach所说,算法和错误报告与您在vanilla Hindley Milner中所做的没有显著差异。typechecker跟踪位置信息,当unifier无法找到解决方案时,它会报告生成失败约束的术语的来源。一个次要细节是,它还尝试对错误消息类型中的自由变量应用可用的部分解决方案


类型系统本身是HM(X)的演变(参见类型和编程语言高级主题第10章)。概述typechecker的最新论文是,它或多或少是如何在最新的GHC SAN中工作的,其中包括一些egde工作。

我熟悉这些概念。通常的推理算法在发现类型不一致时会报告类型错误,这表现为统一中的失败。错误报告会显示推断失败的程序位置,这会导致不完全有用的错误报告,因为可能存在多个错误源。例如,OCaml和ML使用这种算法。Haskell更进一步,报告了几个类型错误,但也遗漏了一些,如我上面所示。因此,我很感兴趣的是,它列出这些错误源的系统方式是什么?@bellpeace在Haskell中键入Haskell(“在我的答案中位于此处”)可能是一个很好的起点。我自己也不知道具体细节,但这篇文章介绍了Haskell类型检查器的(Haskell)实现。我非常感谢您的链接,但遗憾的是它们没有回答我的问题:)
。。。我们不解决类型检查器与编译器前端接口的问题(例如,跟踪错误诊断中的源代码位置)…
我熟悉这些概念。通常的推理算法在发现类型不一致时会报告类型错误,这表现为统一中的失败。错误报告会显示推断失败的程序位置,这会导致