好的,这主要是关于好奇心,但我发现它太奇怪了。
假设我有这段代码
sig.mli
type t = A | B
main.ml
let f =
let open Sig in
function A | B -> ()
如果我编译,一切都会正常工作。
现在,让我们尝试修改sig.mli
。
sig.mli
type t = A | B
exception Argh
和 main.ml
相关。
main.ml
let f =
let open Sig in
function
| A -> ()
| B -> raise Argh
让我们尝试编译它:
> ocamlc -o main sig.mli main.ml
File "main.ml", line 1:
Error: Error while linking main.cmo:
Reference to undefined global `Sig'
那么,这是因为我添加了异常吗?也许这意味着异常像函数或模块一样,需要适当的实现。
但是,如果我写:
main.ml
let f =
let open Sig in
function A | B -> ()
尝试编译吗?
> ocamlc -o main sig.mli main.ml
>
它起作用了!如果不使用异常,它就可以编译通过!
没有理由出现这种行为,对吧?(我在不同的编译器上进行了测试,3.12.0、4.00.0、4.02.3和4.03.0,所有编译器都给出了相同的错误)
mli
文件中而不给出实现是没有问题的。连接是另一回事。 - camlspotter