F#函数不允许我改变可变值

时间:2013-04-23 19:34:08

标签: function variables f# mutable mutation

可能是另一个愚蠢的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以无效方式使用,闭包无法捕获可变变量

为什么?我能做些什么来让我改变它?

1 个答案:

答案 0 :(得分: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/进一步详细说明)。