2017-11-25 198 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

相關問題