Reference 如何在OCaml中声明对空堆栈的引用?

Reference 如何在OCaml中声明对空堆栈的引用?,reference,ocaml,imperative-programming,Reference,Ocaml,Imperative Programming,也许我在这里很愚蠢,所以我想问的更一般的问题是,如何在OCaml中声明对某个类型的空值的引用。通常,我声明一个对自定义空值的引用,例如,如果我有一个类型type point=point of(int*int),我将声明这样的引用let a=ref(point(0,0))。但是,这并不令人满意,因为我必须自己“想出”一个空值。此外,如果您查看标准库()中的引用“堆栈”模块,其中没有空值。您如何处理此问题?如果您确实需要它,您可以这样做: let sr = ref (Stack.create ())

也许我在这里很愚蠢,所以我想问的更一般的问题是,如何在OCaml中声明对某个类型的空值的引用。通常,我声明一个对自定义空值的引用,例如,如果我有一个类型
type point=point of(int*int)
,我将声明这样的引用
let a=ref(point(0,0))
。但是,这并不令人满意,因为我必须自己“想出”一个空值。此外,如果您查看标准库()中的引用“堆栈”模块,其中没有空值。您如何处理此问题?

如果您确实需要它,您可以这样做:

let sr = ref (Stack.create ())
let () = Stack.push 42 !sr
OCaml的值限制并没有阻止它,它最初将具有类型“\u a Stack.t ref”,直到您将其推入


但您几乎不需要它,堆栈已经是可变的。

嗯,堆栈有一个空值,因为
Stack.create()
将创建一个空堆栈。关于您的一般问题,通常使用
None
作为空值。当然,这会自动将您的值提升到选项中。但这是有意的,因为如果您将值创建为空,然后您将更新它,尽管引用没有类型保证,您将永远更新它

范例

let p0 = ref None in
...
p0 := Some (Point (0,0));
...

(如果您想要一个不可变的堆栈,只需使用列表即可。)