在OCaml中创建Array.create的奇怪之处

在OCaml中创建Array.create的奇怪之处,ocaml,ocamlbuild,Ocaml,Ocamlbuild,我是OCaml的新手。当我在Ocaml中使用数组进行编码时,我遇到了一个我无法理解的问题。 代码如下: let a = Array.create 5 (Array.create 5 0); a.(0).(1) <- 1 一切都很好 我的环境: Ubuntu 13.10 Ocaml 4.01.0 open Core.Std 这是Array.create的一个常见陷阱。当数组元素已装箱时,请改用Array.init Array.create使用相同的值初始化数组元素:如果值已装箱,则使用

我是OCaml的新手。当我在Ocaml中使用数组进行编码时,我遇到了一个我无法理解的问题。
代码如下:

let a = Array.create 5 (Array.create 5 0);
a.(0).(1) <- 1
一切都很好

我的环境:

Ubuntu 13.10
Ocaml 4.01.0
open Core.Std 

这是Array.create的一个常见陷阱。当数组元素已装箱时,请改用Array.init

Array.create使用相同的值初始化数组元素:如果值已装箱,则使用相同的指针。在您的例子中,所有元素
a.(i)
都指向由
array.create 5 0创建的相同数组

正确的代码应该是

let a = Array.init 5 (fun _ -> Array.create 5 0)
这将创建5个单独的数组


您应该检查这个Q/A:

您只调用了
数组。创建两次,所以只创建了两个数组——一个数组的元素都指向另一个数组

Array.create
创建一个数组,并将每个元素设置为给定值的副本。所以就好像你做了这件事:

let x = Array.create 5 0;
let a = Array.create 5 <some dummy value>;
a.(0) <- x;
a.(1) <- x;
a.(2) <- x;
a.(3) <- x;
a.(4) <- x;
让x=Array.create 5 0;
设a=Array.5;

a、 (0)仅供参考:

这是数组的文档:

val make:int->'a->'a数组
Array.make nx返回长度为n的新数组,并用x初始化
这个新数组的所有元素最初在物理上等于x(在==谓词的意义上)。因此,如果x是可变的,它将在数组的所有元素之间共享,并且通过其中一个数组条目修改x将同时修改所有其他条目

如果n<0或n>Sys.max\u数组长度,则引发无效的\u参数。如果x的值是浮点数,则最大大小仅为Sys.max\u array\u length/2

val创建:int->'a->'a数组

不赞成**Array.create是Array.make**的别名。

我不认为boxeness与它有任何关系。这更像是一个易变性/免疫性的问题。拳击在这里非常重要。Array.create 5 0创建一个50的数组,因为0未绑定。Array.create 5 p当p是指针时,则有5个指针指向同一事物,通常它不是您想要的。
let x = Array.create 5 0;
let a = Array.create 5 <some dummy value>;
a.(0) <- x;
a.(1) <- x;
a.(2) <- x;
a.(3) <- x;
a.(4) <- x;