min-caml 编译器如何得到类型错误?

How can min-caml compiler got the type error?

我在学习https://github.com/esumii/min-caml

floder测试的例子ack.ml:

let rec ack x y =
 if x <= 0 then y + 1 else
 if y <= 0 then ack (x - 1) 1 else
 ack (x - 1) (ack x (y - 1)) in
print_int (ack 3 10)

如果我换行

print_int (ack 3 10)

对此:

print_int (ack 3 1.23)

然后make,报错:

Fatal error:exception Typing.Error(_,2,3)

我搜索了源代码,找不到 Typing.Error 的信息,或者 Fatal.so min-caml 如何捕获类型错误?ocaml 编译器以其他方式显示:

Error:this expression has type float but an expression was expected of type int

所以信息在哪里

Fatal error:exception Typing.Error(_,2,3)

来自?谢谢!

“致命错误:异常...”是未处理异常的输出(至少在本机可执行文件中,在解释器中消息只是说“异常:...”)。所以这意味着 Typing.Error 异常被引发但未被处理。

Typing.Error指的是Typing模块中定义的异常Error。您会在 typing.ml:

中找到它的定义
exception Error of t * Type.t * Type.t

它是在 line 151 of typing.ml 上通过将语法树添加到先前引发的 Unify 异常而引发的。

Unify 当类型检查器无法统一实际类型和预期类型时,会在文件中的不同位置引发异常。