2

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

这是一个小例子:

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


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

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

4

1 回答 1

4

在 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

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

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

于 2013-04-01T14:49:35.850 回答