2017-11-25 199 views
3

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

foo();; 
0 
foo();; 
1 
+1

不*有*的变量是本地的功能?您可以将变量置于模块的本地。这就是说,这听起来像个坏主意。 ocaml鼓励功能性,无副作用的编程,但事实并非如此。你为什么想这样做?真正的问题是什么? –

+0

@EricLippert必须是本地功能。不能是全球性的。 – Leftismer

+0

我不明白为什么本地模块和该模块的接口隐藏是不可接受的。这与观察性地区的功能有何不同? –

回答

5

是的,这是可能的。您需要定义一个本地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 
+0

甚至只让'foo = let x = ref 0有趣() - > incr x;!x' – Yawar

+0

你的'foo'从'1'开始计数而不是'0'。当然你可以用'-1'作为'ref'的初始值,但我会争论它不是很优雅。 – gallais

相关问题