OCaml:动态数组?

9co*_*an9 2 arrays ocaml resize immutability resizable

我一直在试图弄清楚如何调整OCaml 中已初始化数组的大小。然而,似乎虽然您可以编写一个函数来创建一个全新的数组,并复制旧数组的元素(以及额外的槽),但该函数的输出不能分配给现有数组。一个人会怎样做呢?如果没有的话,是否有一种简单的方法可以使用引用来实现这一点?

这是一个小例子:

让rec function_that_adds_to_array存储参数...=
   (* 假设该函数有一组 if-else 结构来控制它的功能,并进一步说其中一个情况会导致:*)
   let new_array = Array.make(Array.length storage)("Null",("Null",-2))中
   Array.blit集合0 new_array 0索引;(*索引由函数的递归控制*)
   Array.set new_array 索引(obj_name, obj_expr);
   new_array) (* 在尾部插入宏 *)
...
;;


### 主要方法###
let storage = Array.make 10 ((x : string), (a, b)) in
...
虽然是真的
...
存储 = function_that_adds_to_array 存储参数....;
...

function_that_adds_to_array(...) 末尾的打印语句确认返回了一个新数组,其中包含初始数组的旧元素,但是,在 main 方法中,存储保持不变。这是因为 OCaml 元素的不变性吗?我认为数组是可变的。我环顾四周,有人提到编写 hack 来让 OCaml 表现得像 Perl,然而,使用一个人的调整大小 hack 函数被证明是徒劳的。有什么办法可以让存储成为一个新的阵列吗?它需要是一个可更新的元组集合(即 (string, (x, y)) )?

Jef*_*eld 5

在 OCaml 中,您不能分配给变量、句点。对于数组没有特殊限制。但是,您可以将变量绑定到引用,该引用可以保存相同类型的不同值。这种结构就是命令式语言中通常所说的“变量”。要在变量中使用不同大小的数组,x您可以编写如下代码:

# let x = ref [| 0 |];;
val x : int array ref = {contents = [|0|]}
# Array.length x;;
Error: This expression has type int array ref
   but an expression was expected of type 'a array
# Array.length !x;;
- : int = 1
# x := [| 2; 3 |];;
- : unit = ()
# Array.length !x;;
- : int = 2
Run Code Online (Sandbox Code Playgroud)

运算!符取消引用引用,并且:=运算符分配新值。

如果您是 OCaml 新手,我将提供我的标准建议,即您应该在决定重新创建您已经知道的命令式语言模式之前调查不可变数据的使用。如果您不是 OCaml 新手,我为我的无礼表示歉意!

  • 记住你在学校的数学课。变量永远是可变的。 (3认同)