快速浏览
浅谈λ演算与Python中的lambda函数
作者:牛伯雨
Python里有一个十分方便的功能,那就是lambda函数。使用这一功能,可以让代码显得简洁明快,甚至一行搞定很多步运算。在讨论Python的lambda运算之前,我们先来看看它的原型:λ演算。
λ演算
初识λ演算
λ演算十分简洁,比如 λ x . x λx.x λx.x就是一个lambda项(之后我们进一步讨论lambda项的定义)。
形式简单,内容却很丰富:它可以表示一切函数。借助这一工具,我们可以删繁就简探究两个程序的本质是否是一样的,思考编程与逻辑之间的关系,等等。
λ演算是在1936年由阿隆佐·邱奇首次提出的。在同一年,还有另一项深刻地影响着后世的发明——阿兰·图灵的图灵机。这两个发明是分别被独立地提出的,但是不久之后邱奇的学生克莱尼证明,两者在本质上是相同的,真可谓英雄所见略同。也就是说,凡是能用图灵机计算的函数,都可以用λ演算,反之亦然。
就着图来快速说一下图灵机的基本组成:
- 一条无限长的条带,上面有被编号的一个接一个的格子;
- 一个读写头,可以在条带上左右移动,也可以写入提前定义好的有限个符号的其中之一,或读取或删除当前格子里的符号;
- 一套控制规则,告知图灵机要做什么——写入或删除当前符号,向哪个方向移动读写头,或保持当前状态,亦或进入下一状态;
- 一个状态寄存器,以寄存图灵机当前状态。
λ演算的句法结构
两个特征
λ演算具有两个显著的特征:首先,λ演算中的函数都是没有名字的,表达一个函数时,需要把它具体的内容写出来,比如 λ x . x + 5 λx.x + 5 λx.x+5。这个函数表示,不管你给我一个什么数,我都把这个数加5再输出。
第二点是,λ演算中的一个函数只能接收一个变量。如果我们想写一个接收两个变量的函数,则需要把它写成复合函数的形式,也就是第一个函数的输出结果是紧接着第二个函数的输入变量。
例如,这样一个函数 g ( x , y ) = x ∗ x + y ∗ y g(x, y) = x * x + y * y g(x,y)=x∗x+y∗y在λ演算中应写为 λ x . λ y . x ∗ x + y ∗ y λx.λy.x * x + y * y λx.λy.x∗x+y∗y。比如,就这个函数而言,如果x = 5, y = 6,则 g ( 5 , 6 ) = 5 ∗ 5 +