首页 文章

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

提问于
浏览
4

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

在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”,因为“not y”部分 . 但是,她/他可能有一些困难要理解此错误消息的第一部分:如何推断这个“y”具有类型“int”?因此,在引发类型冲突之前,有一组部分推断类型会很有趣 . 对于上面的例子,人们希望解释器告诉第一个“y”(来自“let y = 5”)是int类型,通过它我将知道第二个“y”(来自“not y”)的原因)被推测为int类型 .

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

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

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

谢谢你的想法 .

1 回答

  • 6

    即使程序未编译, -annot 开关生成的类型注释也可用 . 你'll see types for the expressions that the compiler got through, and some of them may be incomplete. This doesn'告诉你编译's reasoning for inferring the types, but it does tell you how far the compiler went and lets you explore what it' s推断 .

    例如,使用此源代码:

    let x = [(let y = 5 in not y); true];;
    
    • x 的类型为 _a list (编译器还远远不足以弄清楚 _a ) .

    • y 的类型为 int .

    • not 的类型为 bool -> bool .

    • 错误消息是第二次出现 y 的类型为 int (我们已经看到它被推断的位置)但是上下文需要类型 bool (我们可以看到,因为 not 是一个参数类型为 bool 的函数) .

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

相关问题