Debugging 我们可以窥探部分推断的打字信息吗。对于未编译的程序,是否从Ocaml顶级/编译器?

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;;

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

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

"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),并查看推断的类型,无论编译是否成功