OCaml变量,在函数调用之间保持其值

OCaml变量,在函数调用之间保持其值,ocaml,mutable,imperative-programming,Ocaml,Mutable,Imperative Programming,在OCaml中,函数中的变量是否有办法在函数调用之间保持其值?它应该像Pythons的默认参数一样工作,默认参数是每个函数调用中对同一对象的引用,或者函数应该产生而不是显式返回值。效果应如下(如果函数返回自然数): 是的,这是可能的。您需要在闭包外部定义一个localref,访问其值,并在每次使用闭包时进行修改,如下所示: let foo = (* local variable x *) let x = ref 0 in (* the closure that will be nam

在OCaml中,函数中的变量是否有办法在函数调用之间保持其值?它应该像Pythons的默认参数一样工作,默认参数是每个函数调用中对同一对象的引用,或者函数应该产生而不是显式返回值。效果应如下(如果函数返回自然数):


是的,这是可能的。您需要在闭包外部定义一个local
ref
,访问其值,并在每次使用闭包时进行修改,如下所示:

let foo =
  (* local variable x *)
  let x = ref 0 in
  (* the closure that will be named foo *)
  fun () -> let r = !x in
            x := r+1; r

变量必须是函数的局部变量吗?您可以使变量成为模块的局部变量。尽管如此,这听起来是个坏主意;ocaml鼓励功能性的、无副作用的编程,但事实并非如此。你为什么要这样做?真正的问题是什么?@EricLippert必须是本地的才能发挥作用。不能是全局的。我不理解为什么本地模块和隐藏在该模块接口中是不可接受的。这在观测上与函数的局部性有什么不同?通常通过使用状态单子之类的东西来实现。一个函数,它以某种方式也接受状态(例如,作为(隐式)输入,然后改变状态(或将新状态作为额外的输出参数传递)。或者甚至只是
let foo=let x=ref 0 in fun()->incr x;!x
你的
foo
1
开始计数,而不是
0
。当然你可以使用
-1
作为
ref
的初始值,但我认为这不是很优雅。
let foo =
  (* local variable x *)
  let x = ref 0 in
  (* the closure that will be named foo *)
  fun () -> let r = !x in
            x := r+1; r