Debugging 我们可以窥探部分推断的打字信息吗。对于未编译的程序,是否从Ocaml顶级/编译器?
我想知道,在Ocaml中,是否有部分输入信息。对于不编译的程序,是否可以通过toplevel/编译器的某些现有功能绘制?让我解释一下 在Ocaml中,众所周知,推断类型可以通过-annot文件检索。然而,有时我们有一段代码由于某些键入错误而无法编译。它给出了一个导出到此模式的顶层的错误Debugging 我们可以窥探部分推断的打字信息吗。对于未编译的程序,是否从Ocaml顶级/编译器?,debugging,ocaml,partial,typing,Debugging,Ocaml,Partial,Typing,我想知道,在Ocaml中,是否有部分输入信息。对于不编译的程序,是否可以通过toplevel/编译器的某些现有功能绘制?让我解释一下 在Ocaml中,众所周知,推断类型可以通过-annot文件检索。然而,有时我们有一段代码由于某些键入错误而无法编译。它给出了一个导出到此模式的顶层的错误 "This expression has type A, but was expected type B" 一个人为的例子是 # let x = let y = 5 in not y;;
"This expression has type A, but was expected type B"
一个人为的例子是
# 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
这段代码的程序员应该很好地理解此消息的第二部分,即。,
“y应为bool类型”,因为“不是y”部分。但是,她/他可能难以理解此错误消息的第一部分:如何推断此“y”的类型为“int”?因此,在引发类型冲突之前,拥有部分推断类型集是很有趣的。对于上面的例子,我们希望解释器告诉我们第一个“y”(来自“let y=5”)是int类型的,由此我将知道第二个“y”(来自“not y”)被推断为int类型的原因
您能告诉我所描述的功能是否已经由某个ocaml解释器/编译器提供了吗
一般来说,我的问题是:ocamltoplevel或其解释器能否生成用户可以检索的部分推断类型,以便更有效地找到其键入错误的来源
由于部分推断类型注释的非唯一性,这个问题可能没有意义。但是,示例应该表明,至少在某些情况下,某些部分推断的类型有其用法
谢谢您的想法。即使程序未编译,也可以使用由
-annot
开关生成的类型批注。您将看到编译器获得的表达式的类型,其中一些可能不完整。这并没有告诉您编译器推断类型的推理,但它确实告诉您编译器走了多远,并让您探索它推断的内容
例如,使用以下源代码:
let x = [(let y = 5 in not y); true];;
具有类型x
(编译器还没有弄清楚\u a列表
)\u a
的类型为y
int
的类型为not
bool->bool
- 错误消息是第二次出现的
的类型为y
(我们已经看到了它的推断位置),但是上下文期望类型为int
(我们可以看到,因为bool
是一个参数类型为not
的函数)bool
ocamlc-c-annot
,在中打开源代码(例如Emacs),并查看推断的类型,无论编译是否成功