如果我们可以禁用功能,错误消息会改善吗?

pig*_*ker 17 haskell types compiler-errors

受到这次reddit讨论的启发,我想知道在理解错误信息方面是否存在"Dr Scheme"式辅助初学者方法的技术障碍.一个典型的例子就是臭名昭着

Prelude> 1 "doesn't"

<interactive>:3:1:
    No instance for (Num ([Char] -> t0))
      arising from the literal `1'
    Possible fix: add an instance declaration for (Num ([Char] -> t0))
    In the expression: 1
    In the expression: 1 "doesn't"
    In an equation for `it': it = 1 "doesn't"
Run Code Online (Sandbox Code Playgroud)

假设我们要做出本地假设程序员不会声明新实例.实际上,人们可以在Haskell中仅仅通过前导类进行交互deriving,所以这种假设对初学者来说并不现实.在这种假设下,上述错误信息将与此无关.我们能改进吗?我们可能仍然需要弄清楚要说多少1,但我们肯定可以更直接地解决这个问题.

是否还有其他机会根据现实的简化假设重新构建错误消息?注意,我问的问题是根据程序员的经验模型更改错误消息的文本:我不是在本地考虑对哪些代码被认为是错误的任何更改(例如,假设初学者将使用专门的重载事物类型,消除歧义).

后续想法:假设"配置文件"为学生建模,现有错误消息的文本是否包含足够的信息来支持这种转换?也就是说,一个有进取心的黑客是否可以实现一个可懂度增强的后处理器,ghci而不会让总部的繁忙人员感到不安?

C. *_*ann 10

我不相信为了错误消息而忽略某些功能会有所帮助.

一方面,由初学者真正遇到的错误从其他人有什么不同?仅仅因为我知道如何解释"对于这个荒谬的事物,这显然不是一个数字类型的错误实例"错误并不意味着我不会更加清楚地指出GHC更明确地指出了我所做的那些引起挑衅的事情.这样的消息.

我建议初学者或专家编写实例或任何其他类型的"高级"代码的情况差别很小.然而,初学者将在这种情况下进行编码,而不是经常进行编码,其中包含"从不"的包含下限.

如果一个人希望将初学者与语言的奥术角隔离,那么请确保他们根本不会遇到它们.例如(ha,ha),在首次引入语言时,可以完全避免使用类型类.

我想不出任何一个更适合初学者的错误信息的情况,只要它不丢弃信息,对其他人来说也不会更愉快.

假设我们要做出本地假设程序员不会声明新实例.

假设我们假设程序员不会声明Haskell报告定义类和/或类型的孤立实例.对于初学者来说,这种假设是最切合实际的,事实上,作为一般规则似乎是合理的.

在很少的情况下,由于编译器错误而添加这样的实例是合理的.随着匿名编写器monad的明显和磨损例外(除非我上次检查后已经补救)标准类类型的孤立实例似乎极不可能,并且只有当库意外地忽略了一些时才会出现这样的一个或另一个实例,或者是陈旧的,尘土飞扬的,足以早于像Applicative或者之类的东西的流行Foldable.在任何情况下,任何确实想要这样一个实例的人都可以安全地被认为知道他们做得足够好以解释GHC的错误信息,无论它是什么.

但足够关于这个特定的例子.

是否还有其他机会根据现实的简化假设重新构建错误消息?

很可能,但我们也远远没有用尽现实复杂假设的空间!

上述实例的重点在于,通过使用已经可用于编译器的信息和检查更大上下文的启发式方法(例如,在定义某些事物的地方,将上述示例与非孤立实例区分开来),可以改进错误消息一般来说.

后续想法:假设"配置文件"为学生建模,现有错误消息的文本是否包含足够的信息来支持这种转换?

除了在最简单和最令人震惊的情况下,我真的看不到这个工作得很好,你给出的例子是一个值得注意的例子.它可以改写现有的错误风格,但初学者将从拥有现有消息可能不包含的更详细/明确的信息中受益最多.

考虑另外两个长期困扰初学者的错误消息:关于匹配"刚性类型变量"的抱怨和关于"无限类型"的抱怨.修改可能会有所改善,但缺少在每个错误消息中包含多态性教程,它对初学者修复代码没有多大帮助,除非你能够解释相关的表达式并输入足够好的特定的原因.

与检查源代码一起,"翻译"可能有一些支持,但我怀疑直接修改GHC将很快成为最简单的路径.生成错误消息将是一个有趣的扩展点,但我不认为这可以通过GHC现有的插件基础结构来完成.


我预计,任何这一切的最大障碍都不是实施.相反,它是决定哪种启发式方法可以改善错误信息而不是完成相反的操作.没有客观数据的基础,这是一个容易出错(ha,ha)猜谜游戏.汇总(主要是中级或新手)Haskell程序员遇到的错误的大型调查,以及最重要的是他们为解决问题所做的实际改变,这将是非常有趣的.


Jas*_*ich 5

我相信Haskell 的 Helium子集是尝试这样做的.自从我尝试了它已经很长时间了,但是IIRC,它产生了比GHC更好的错误信息.