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

あるいは単に 'let foo = let x = ref 0を楽しくする() - > incr x;!x' – Yawar

+0

あなたの 'foo'は' 0'ではなく '1'で数え始めます。もちろん 'ref'の初期値として' -1'を使うことができますが、あまりエレガントではありません。 – gallais

関連する問題