可能是另一个愚蠢的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
以无效方式使用,闭包无法捕获可变变量
为什么?我能做些什么来让我改变它?
答案 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/进一步详细说明)。