F#入门-第三章 功能性-第四节 词法闭包

时间:2022-09-24 20:28:00

    lambda表达式可以创建词法闭包。lambda表达式可以创建词法闭包。词法闭包是指,将创建lambda表达式时的环境保存起来,创建lambda表达式时所使用到的变量在之后(每次调用函数时)都可以被利用。

    通过使用词法闭包,可以实现譬如计数器之类的功能。

使用词法闭包实现计数器
> let counter x = let a = ref x in fun () -> a:=!a 1;!a;;
val counter : int -> (unit -> int)
> let a = counter 3;;
val a : (unit -> int)
> let b = counter 10;;
val b : (unit -> int)
> a();;
val it : int = 4
> a();;
val it : int = 5
> b();;
val it : int = 11
> b();;
val it : int = 12


    在这个例子中,定义了一个计数器,该计数器保留初期值x,每次调用时将该整数加1并返回。这里,fun()的部分将变量a保存在环境中。同时,请注意a和b分别保留在不同的环境中。

    如果用惯了c语言,可能会认为每次返回了函数内的本地变量的地址。但是与c语言中的创建在堆栈(stack)空间里的本地变量不同,F#中的本地变量是创建在堆(heap)空间里的,所以不会产生在c语言里所产生的问题。相比较来说,c语言是动态作用领域语言,F#是静态作用领域语言。

    另外,闭包一词本身没有精确定义,业界都比较抽象地使用“词法闭包”这一说法。一般行业用语中,很多时候用“闭包”的说法来代替“词法闭包”。