2009-09-26 2 views
9

私はF#でいくつかの簡単なコードを書き込もうとしています、と私はこのエラーを取得:可変変数 'i'は無効な方法で使用されます。

Error 1 The mutable variable 'i' is used in an invalid way. Mutable variables may not be captured by closures. Consider eliminating this use of mutation or using a heap-allocated mutable reference cell via 'ref' and '!' 

コード:

let printProcess = async { 
     let mutable i = 1; 
     while true do 
      System.Console.WriteLine(i);//error is here 
      i <- i + 1; 
    } 

なぜそれは私が変数を印刷させないのだろうか?

答えて

17

閉包内のmutablesを参照することはできず、seq {}ブロックやasync {}ブロックなどの構造が含まれます。

あなたは

let printProcess = async { 
     let i = ref 1 
     while true do 
      System.Console.WriteLine(!i) 
      i := !i + 1 
    } 

を書くことができ、いくつかの議論のためthis blogを参照してください。

+6

なぜこれを行う必要があるのか​​の簡単な答えは、スタック上に '可変'値があり、 'ref'値がヒープ上にあることです。関数が終了するとすぐにスタックフレームがクリアされるので、変更可能な値はすべて再利用されます。もう一方のRef値は、他のガベージコレクションオブジェクトと同様に維持されます。 –

+3

これを置く別の方法は、F#が変数ではなく値を取得するということです。このため、変更可能な変数の値を取り込むことは、値自体が常に不変であるため、不変の変数の値を取り込むことと同じになります。この行動はおそらく人々が期待するものではなく、したがって禁止されています。 – Joh

関連する問題