我知道在OCaml中,默认情况下我们无法更改变量的值。例如,我们不能执行以下操作:
let a = 1;
a = 2;
为此,我们添加了关键字ref
:
let a = ref 1; a := 2;
但我不了解的是,对于Array,我们不需要这样做。即使数组的类型不是ref 'a
,我们也可以更改它的值。
例如,我可以做:
let a = Array.create 3 0; a.(1) <- 2;
没有任何错误。
那么,为什么不使用引用就可以更改Array的值呢?
ref and
mutable`和有什么区别?
谢谢!
答案 0 :(得分:1)
简而言之,可变字段在引用之前排在第一位。实际上,引用类型不是OCaml中的原始类型。定义为
type 'a myref = { mutable contents: 'a}
let ref x = { contents=x }
let (!) r = r.contents
let (:=) r x = r.contents <- x
(另请参见http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#1_References)
因此,OCaml中可变值的原始构造块是可变字段,而不是引用。同样,数组的所有字段在设计上都是可变的。