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或其解释器可以产生用户可以检索的部分推断类型,以便更有效地找到其输入错误的来源吗?
由于部分推断类型注释的非唯一性,此问题可能没有意义.但是,示例示例应该表明至少在某些情况下,某些部分推断类型具有其用法.
谢谢你的想法.
-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)中打开源代码并查看推断类型是否编译成功或不.