debugging - 我们可以查看部分推断的输入信息吗?来自 Ocaml 顶层/编译器的程序无法编译?

标签 debugging ocaml partial typing

我想知道,在 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 应该是 bool 类型”,因为“不是 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];;
  • x有类型 _a list (编译器还没有搞清楚 _a )。
  • y有类型 int .
  • not有类型 bool -> bool .
  • 错误信息是第二次出现 y有类型 int (并且我们已经看到了它的推断位置)但是上下文需要类型 bool (我们可以看到,因为 not 是一个参数类型为 bool 的函数)。

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

    关于debugging - 我们可以查看部分推断的输入信息吗?来自 Ocaml 顶层/编译器的程序无法编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6834018/

    相关文章:

    c# - 如何获取有关事件的调试信息

    functional-programming - 我需要在 OCaml 中调用 Random.self_init 吗?

    random - 如何在 Ocaml 中随机选择一个元素?

    php - 使用 include_partial() 部分传递 symfony 1.4 的对象?

    xcode - 禁用 Google 应用测量调试日志记录

    debugging - 更具体的 OpenGL 错误信息

    c# - 尝试创建分部类时出错

    C#:部分方法和操作,未实现的主体

    linux - 核心转储仅显示一个堆栈帧

    ocaml - 为什么编译器不能匹配这个函数类型?