2013-04-23 28 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