返回带闭包的函数

ay.*_*llo 6 f#

以下代码:

let CreateFunc=
    let counter = ref 0
    fun () -> counter := !counter + 1; !counter

let f1 = CreateFunc
let f2 = CreateFunc

printfn "%d" (f1())
printfn "%d" (f1())
printfn "%d" (f2())
printfn "%d" (f2())
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
3
4
Run Code Online (Sandbox Code Playgroud)

所以,基本上,我们在这里看到的是f1和f2是相同的功能 - 因为它们显然共享同一个'counter'实例.

预期的产出是:

1
2
1
2
Run Code Online (Sandbox Code Playgroud)

问题:f1和f2不应该是两个独立的实例吗?毕竟它们是由两个不同的'CreateFunc'调用创建的?

谢谢

Ram*_*nir 8

let CreateFunc() =
    let counter = ref 0
    fun () -> counter := !counter + 1; !counter

let f1 = CreateFunc()
let f2 = CreateFunc()

printfn "%d" (f1())
printfn "%d" (f1())
printfn "%d" (f2())
printfn "%d" (f2())
Run Code Online (Sandbox Code Playgroud)

输出是

1
2
1
2
Run Code Online (Sandbox Code Playgroud)

说明:

在您的原始解决方案中,CreateFunc是一个函数,但始终是相同的函数(CreateFunc,f1并且f2都是同义词,都指向相同的函数).在我的解决方案中CreateFunc是一个函数,无论何时调用它都会返回一个函数,因此每个函数都有自己的状态(即counter).

简而言之:原始CreateFunc值是一个值,总是相同的值.

  • 为了详细说明@Ramon Snir的答案,普通的mutable不允许在闭包中,所以必须在这里使用ref cell. (2认同)