gpt4 book ai didi

exception - 不能仅在 mli 文件中定义异常

转载 作者:行者123 更新时间:2023-12-01 08:52:40 24 4
gpt4 key购买 nike

好的,这主要是出于好奇,但我觉得太奇怪了。

假设我有这段代码

sig.mli

type t = A | B

ma​​in.ml

 let f = 
let open Sig in
function A | B -> ()

如果我编译,一切都会正常。

现在,让我们尝试修改 sig.mli

sig.mli

type t = A | B
exception Argh

main.ml

ma​​in.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'

嗯,仅仅是因为我添加了异常吗?也许这意味着异常就像函数或模块,你需要一个适当的实现。

但是,如果我写呢

ma​​in.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,它们都给出了相同的错误)

最佳答案

与变体不同,异常不是纯类型,需要在 .ml 文件中实现。使用 ocamlc -dlambda -c x.ml 编译以下代码:

let x = Exit

-- the output --
(setglobal X!
(seq (opaque (global Pervasives!))
(let (x/1199 = (field 2 (global Pervasives!)))
(pseudo _none_(1)<ghost>:-1--1 (makeblock 0 x/1199)))))

可以看到 (let (x/1999 = (field 2 (global Pervasives!))).. 表示赋值存储在2nd位置的值Pervasives 模块。这是 Exit 的值。异常有其值,因此需要 .ml

变体不需要实现。这是因为它们的值可以纯粹从它们的类型信息构造:构造函数的标记整数。我们不能将标记整数分配给异常(及其通用版本,开放类型构造函数),因为它们是公开定义的。相反,他们在 .ml 中为他们的标识定义值。

关于exception - 不能仅在 mli 文件中定义异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38034338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com