在OCaml复制建筑?

Typ*_*ats 2 ocaml copy reference

OCaml值通过引用传递,而不是通过值传递.当值恒定时,引用和值之间没有可观察到的差异.但是,当值是可变的时(例如具有可变字段的结构),我可能想要复制它,以便当一个变量改变该值时,另一个设置为前一个变量的变量也不会发生变异.我可以在OCaml中这样做吗?

cam*_*ter 5

恐怕没有自动简便的方法.您必须自己编写一些代码来复制值.例如,

type t = { x : int option; mutable y : int option }

let copy t = { t with x = t.x }

let () =
  let t = { x = None; y = Some 1 } in
  let t' = copy t in
  t.y <- None;
  assert (t'.y <> None) (* check t'.y is not shared *)
Run Code Online (Sandbox Code Playgroud)

还有copy原始可变类型的函数,例如Bytes.copyArray.copy.

如果您的值是嵌套的,那么您的复制功能可能会也可能不会复制内部值.

有一个神奇的函数Obj.dup可以创建一个参数的深层副本,但我相信你不会想要使用它,因为它会递归复制所有的值节点,包括不可变量,这对空间效率非常不利.