如何在OCaml中保存和更改变量的值?

EBM*_*EBM 5 ocaml variable-assignment mutation

这可能是一个非常新手的问题,但我找不到答案.我需要存储,例如一个列表,然后在同一个指针下用另一个替换它.

pad*_*pad 11

它可以通过参考完成:

let fact n =
  let result = ref 1 in (* initialize an int ref *)
  for i = 2 to n do
    result := i * !result (* reassign an int ref *)
   done;
  !result
Run Code Online (Sandbox Code Playgroud)

您不经常看到引用,因为您可以在递归或高阶函数中使用不可变值来执行相同的操作:

let fact n =
   let rec loop i acc =
      if i > n then acc
      else loop (i+1) (i*acc) in
   loop 2 1
Run Code Online (Sandbox Code Playgroud)

无副作用的解决方案是首选,因为它们更容易推理并且更容易确保正确性.

  • 请参阅我在答案中提到的链接.基本上`ref 0`是一个记录`{mutable contents:int}`,`contents`由`0`初始化,`contents`可以在以后重新分配. (3认同)