gpt4 book ai didi

f# - 返回一个带闭包的函数

转载 作者:行者123 更新时间:2023-12-04 14:33:24 25 4
gpt4 key购买 nike

以下代码:

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())

输出:
1
2
3
4

所以,基本上,我们在这里看到的是 f1 和 f2 是相同的函数——因为它们显然共享同一个“计数器”实例。

预期的输出是:
1
2
1
2

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

谢谢

最佳答案

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())

输出是
1
2
1
2

解释:

在您的原始解决方案中, CreateFunc是一个函数,但始终是同一个函数( CreateFuncf1f2 都是同义词,都指向同一个函数)。在我的解决方案中 CreateFunc是一个返回 的函数新品 函数无论何时被调用,因此每个函数都有自己的状态(即 counter )。

总之:原 CreateFunc是一个值,总是相同的值。

关于f# - 返回一个带闭包的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8049244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com