F#入门-第三章 功能性-第四节 词法闭包
来源:互联网 发布:java培训哪个学校好 编辑:程序博客网 时间:2024/06/05 13:33
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#是静态作用领域语言。
另外,闭包一词本身没有精确定义,业界都比较抽象地使用“词法闭包”这一说法。一般行业用语中,很多时候用“闭包”的说法来代替“词法闭包”。
- F#入门-第三章 功能性-第四节 词法闭包
- F#入门-第三章 功能性-第一节 柯里化
- F#入门-第三章 功能性-第二节 高阶函数(map)
- F#入门-第三章 功能性-第六节 管道运算符
- F#入门-第四章 面向对象-第四节 封装
- F#入门-第三章 功能性-第三节 高阶函数(fold)
- F#入门-第三章 功能性-第五节 运算符的优先顺序
- F#入门-第四章 面向对象-第六节 重载
- F#入门-第四章 面向对象-第七节 接口
- F#入门-第二章 F#基础-第四节 let语句-值的绑定
- 第三章 --- 第四节
- F#入门-第四章 面向对象-第二节 类与构造器
- F#入门-第一章 概述-第四节 解释器的使用方法
- F#入门-第四章 面向对象-第一节 对象
- F#入门-第四章 面向对象-第三节 成员函数
- F#入门-第四章 面向对象-第五节 继承
- F#入门-第四章 面向对象-第八节 对象表达式
- F#入门-第四章 面向对象-第九节 索引器
- POJ 1588 Reverse Roman Notation
- freemarker 简介
- 精彩网址收集
- 抉择之:外企与事业单位
- 构建插件式的应用程序框架(四)----服务容器
- F#入门-第三章 功能性-第四节 词法闭包
- jfreechart 简介
- photo identification
- .NET必知——.NET面试题及答案
- 一流是做出来的,不是评估出来的
- tslib1.4的安装
- 五种提高 SQL 性能的方法
- 构建插件式的应用程序框架(五)----管理插件
- DAL