4

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

在 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 is expected of type bool”,因为“not y”部分。但是,她/他可能难以理解此错误消息的第一部分:如何推断此“y”具有“int”类型?因此,在引发类型冲突之前拥有部分推断类型集会很有趣。对于上面的示例,希望解释器告诉第一个“y”(来自“let y = 5”)是 int 类型,由此我将知道第二个“y”(来自“not y”)的原因) 被推断为 int 类型。

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

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

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

谢谢你的想法。

4

1 回答 1

6

-annot即使程序没有编译,由开关生成的类型注释也是可用的。您将看到编译器通过的表达式的类型,其中一些可能不完整。这并没有告诉您编译器推断类型的原因,但它确实告诉您编译器走了多远,并让您探索它推断的内容。

例如,使用此源代码:

let x = [(let y = 5 in not y); true];;
  • x有类型_a list(编译器还没有弄清楚_a)。
  • y有类型int
  • not有类型bool -> bool
  • 错误消息是第二次出现的y具有类型int(我们已经看到它是在哪里推断的),但上下文需要该类型bool(我们可以看到,因为not它是一个参数类型为 的函数bool)。

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

于 2011-07-26T18:58:18.567 回答