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
была функцией, но всегда одной и той же функцией (CreateFunc
, f1
и f2
были синонимами, указывающими на одну и ту же функцию). В моем решении CreateFunc
- это функция, которая возвращает функцию new всякий раз, когда она вызывается, таким образом, каждая функция имеет свое собственное состояние (т.е. counter
).
Вкратце: оригинал CreateFunc
был значением, всегда одним и тем же значением.