3

おそらく別のばかげた F# 初心者の質問です...しかし、それでも私を悩ませています

オンラインでこれに対する答えが見つからないようです...間違った用語を検索したせいかもしれませんが、ええ

とにかく私のコードは次のようになります:

let counter() = 
    let mutable x = 0

    let increment(y :int) =
        x <- x + y // this line is giving me trouble
        printfn "%A" x // and this one too

    increment // return the function

Visual Studio はx、それが無効な方法で使用されていることを教えてくれます。変更可能な変数はクロージャーによってキャプチャできません。

何故ですか?そして、それを変異させるにはどうすればよいですか?

4

1 に答える 1

9

refエラー メッセージが示すように、代わりにセルを使用できます。

let counter() = 
    let x = ref 0

    let increment(y :int) =
        x := !x + y // this line is giving me trouble
        printfn "%A" !x // and this one too

    increment // return the function

これは、合法である場合にコードが行うこととまったく同じです。演算子は!、ref セルから値を取得し:=、新しい値を割り当てます。なぜこれが必要なのかというと、クロージャーによって変更可能な値をキャプチャするセマンティクスが混乱を招くことが証明されているからです。セルを使用するrefと、物事がより明確になり、エラーが発生しにくくなります (詳細については、 http://lorgonblog.wordpress.com/2008/11/12/on-lambdas-capture-and-mutability/を参照してください)。

于 2013-04-23T19:39:01.193 に答える