2016-07-21 3 views
4

変更可能な値はクロージャーでは使用できませんが、for .. inの式はokです。 C#ではforループがイテレータを更新しますが、F#ではそうではありません。方法と理由?なぜ閉鎖で許可されたのか?

答えて

14

F#のfor .. inはC#のforeachループと同じですが、C#のforループではありません。そしてC#5以来、foreachループはではありません。イテレータを更新します。あなたは

for txt in ["abc"; "def"; "ghi"] do 
    printfn "%s" txt 

を書くならば、あなたが実際に3を作成している:これは、F#は何もあり詳細はForeach now captures variables! (Access to modified closure)を参照してください、それは代わりに、これは閉鎖のために重要な意味を持っている(ループを通して各反復のための新しい変数を作成し、新しい文字列変数にあなたがそのループを実行するだけではなく、1

次-非常に機能的でないコードを試し、F#は新しい変数を毎回作成されていることを自分自身に証明するために:。

let actions = new System.Collections.Generic.List<System.Action<unit>>() 
for txt in ["abc"; "def"; "ghi"] do 
    actions.Add(fun() -> printf "%s " txt) 
for action in actions do 
    action.Invoke() 

txtfor .. inループで毎回同じ変数だった場合は、C#4以前と同様にghi ghi ghiが出力されます。匿名関数が変数の上で閉じ、ループの後に変数ghiが含まれるためです。しかし、上記のコードを実行すると、C#5以降のようにabc def ghiが表示されます。

だからあなたの質問への答えは、それが実際には何もを変異ていないので、F#が閉鎖にfor .. inを可能にすることです。

+1

偉大な答え、thanx。 – aikixd

関連する問題