2011-07-02 62 views
2

我正在操作Ocaml中的二维数组。我有一些问题:Ocaml中的数组操作

1)如何声明一个长度为int64而不是int的数组?例如,Array.make : int -> 'a -> 'a array,如果我需要一个索引类型为int64的较大阵列,该怎么办?

2)我可以写类似以下内容:

let array = Array.make_matrix 10 10 0 in 
array.(1).(2) <- 5; array.(3).(4) <- 20; (* where I modify a part of values in array) 
f array ... 
... 

上面的代码在我看来不自然,因为我们修改的arraylet里面的价值,我必须这样,还是有更自然的方式来做到这一点?

任何人都可以帮忙吗?非常感谢你!

回答

4

在64位系统上,阵列模块的OCaml阵列大小限制为2^54-1,在32位系统上限制为4,194,303。对于浮点数组,极限值减小2倍。在这两种情况下,索引都很容易表示为int,因此使用int64作为索引没有任何优势。

对于32位系统的值是方式对于某些问题太小,所以有另一个名为Bigarray的模块可以代表更大的数组。它支持更大的数组,但索引仍然是int。如果你真的需要有大的索引,你可能在64位系统上,这不是一个限制。如果没有的话,无论如何,你会用尽地址空间,我会想。也许你真正想要的是一个哈希表?

我不确定你在说什么“let”。让的目的是给一个名字。在开始存储数值之前给数组赋一个名字并不是不合理的。如果你想在创建数组的时候定义这些值,你可以使用Array.init并编写一个任意函数来设置数组值。

OCaml中的数组代码本质上是势在必行的,所以通常你最终会看到它的代码。我经常使用beginend,只是拥抱它的Algolic品质。