我们可以查看部分推断的输入信息.来自Ocaml toplevel /编译器的程序无法编译?

zel*_*ell 4 debugging ocaml typing partial

我想知道,在Ocaml中,是否有部分输入信息.可以通过toplevel/compiler的一些现有功能绘制,对于不编译的程序?让我解释.

在Ocaml中,众所周知,推断类型可以通过-annot文件检索.但是,有时我们有一段代码由于某些输入错误而无法编译.它会将错误导出到此模式的顶层

"This expression has type A, but was expected type B" 
Run Code Online (Sandbox Code Playgroud)

一个人为的例子

# let x =  
  let y = 5  in
  not y;;
    Characters 32-33:
    not y;;
        ^
Error: This expression has type int 
       but an expression was expected of type bool
Run Code Online (Sandbox Code Playgroud)

这段代码的程序员应该很好地理解这条消息的第二部分,即"y是期望类型bool",因为"not y"部分.但是,她/他可能有一些困难要理解此错误消息的第一部分:如何推断这个"y"具有类型"int"?因此,在引发类型冲突之前,有一组部分推断类型会很有趣.对于上面的例子,人们希望解释器告诉第一个"y"(来自"let y = 5")是int类型,通过它我将知道第二个"y"(来自"not y")的原因)被推测为int类型.

你能告诉我一些ocaml解释器/编译器是否已经提供了所描述的功能吗?

一般来说,我的问题是:ocaml toplevel或其解释器可以产生用户可以检索的部分推断类型,以便更有效地找到其输入错误的来源吗?

由于部分推断类型注释的非唯一性,此问题可能没有意义.但是,示例示例应该表明至少在某些情况下,某些部分推断类型具有其用法.

谢谢你的想法.

Gil*_*il' 6

-annot即使程序没有编译,也可以使用由交换机生成的类型注释.您将看到编译器通过的表达式的类型,其中一些可能不完整.这并没有告诉你编译器推断类型的推理,但它确实告诉你编译器走了多远,让你探索它推断出来的东西.

例如,使用此源代码:

let x = [(let y = 5 in not y); true];;
Run Code Online (Sandbox Code Playgroud)
  • x有类型_a list(编译器还没有达到足够的程度_a).
  • y有类型int.
  • not有类型bool -> bool.
  • 错误消息是第二次出现y的类型int(我们已经看到它被推断的位置)但是上下文需要类型bool(我们可以看到,因为它not是一个参数类型为的函数bool).

我不知道如何从顶层看到这些类型,但是如果你有一个包含代码的源文件,你可以运行ocamlc -c -annot,在合适的编辑器(如Emacs)中打开源代码并查看推断类型是否编译成功或不.