封装可变状态

ste*_*ven 4 f#

我正在通过F#Wikibook工作,我已经进入了参考单元格的部分,其中出现以下代码片段:

let incr =
    let counter = ref 0
    fun () ->
        counter := !counter + 1
        !counter;;
Run Code Online (Sandbox Code Playgroud)

然后调用此函数三次,分别给出值1,2和3.有人可以解释为什么这个函数每次调用时都不会返回1吗?我解释这段代码的方式(显然不是正确的解释,因此问题)是,首先,声明参考单元格'counter',内容等于0,然后'counter'的内容递增1并且然后使用匿名函数解除引用.由于每次调用incr();;声明'counter'都有内容0,我不明白为什么调用incr();;不会每次只返回1.

谁能纠正我的理解?

提前致谢.

Dan*_*iel 6

可以这样想:incr价值,而不是功能.它的值是一个捕获某些状态(即counter)的闭包.这是随后被多次调用的闭包(incr仅执行/分配一次).也许看到等效的C#会有所帮助.

static Func<int> MakeCounter() {
    int counter = 0;
    return () => {
        counter++;
        return counter;
    };
}

var incr = MakeCounter();
incr(); //1
incr(); //2
incr(); //3
Run Code Online (Sandbox Code Playgroud)