2013-04-23 32 views
2

可能再有一個愚蠢的F#初學者的問題...但它煩我都一樣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是一個無效的方式使用,是可變的變量不能被捕獲關閉

這是爲什麼?我能做些什麼來讓我改變它呢?

回答

8

由於錯誤信息表明,你可以使用一個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/以進一步闡述)。

+0

那該怎麼辦?請進一步詳細解釋我是一個完整的noob在這種語言 – 2013-04-23 19:39:51

+0

@ElectricCoffee - 我已經添加了進一步的解釋。我已驗證我的代碼有效,所以我很驚訝您遇到問題 - 您確定已刪除舊代碼嗎? – kvb 2013-04-23 19:45:03

+0

事實證明,我嘲弄了一會兒,並忘記在將更改應用於我的代碼後刪除'mutable' ......它現在可以工作了,謝謝! – 2013-04-23 19:46:06