八个比特

通俗的解释lambda表达式

字数统计: 839阅读时长: 3 min
2019/04/07 Share

关于虚拟函数lambda:需要一个函数,但是又不想费神去命名一个函数的场合下使用.在 lambda 演算中,每个表达式都代表一个只有单独参数的函数,这个函数的参数本身也是一个只有单一参数的函数,同时函数的值是又一个只有单一参数的函数.

/*关于lambda演算的解释:

我们经常用

(1-1)

表示y是x的函数.但是,如果我们令

(1-2)

那么可能是y=f(x),也可能是y=g(x-1),那么这个时候y实际上是x-1的函数.

为什么会出现这种混淆?

1)因为传统的函数表示方法(1-1)中没有显式给出函数的自变量,即使是后面两种表达方法(1-2)也是把函数体和自变量的说明分开了,这种表达方式依然有问题.

2)传统数学中对函数的定义和调用不加严格区分.那么x^2-2*x+1既可以看成是函数f(x)的定义,又可以看成是函数g(x)对变量x-1的调用.

而定义和调用在概念上有很大区别,传统函数表示方法很难表达清楚这种函数结构层次上的表化,更不用说多变量函数以及泛函了.

丘奇等数学家给出了解决方法:λ演算.基本定义形式如下,

λ<变量>.<表达式>

用这种方法定义的函数叫λ表达式.λx.x2-2*x+1就是一个λ表达式,其中显式地指出了x是变量.

当将这个λ表达式定义应用于具体的变量值时,需要用一对括号把表达式括起来,比如,

(λx.x^2-2*x+1)1

应用过程是把变量值赋值给表达式中的x,并去掉 λ<变量>,过程如下,

(λx.x^2-2*x+1)1=1-2*1+1=0

看到这里是不是熟悉了很多,这其实就对应着程序语言中的函数定义,参数传递,函数调用.函数式编程语言Lisp表达的也正是这种形式.

如果有多个变量呢?应该按照固定的顺序排列和传递,比如,

λx.λy.x+y

调用过程如下,

( ( λx.λy.2*x+y) 1) 2 = ( λy.2+y) 2 = 4

其中,x=1,y=2,也就是说计算顺序是固定的,从里层到外层一层层归约,如果改变变量的次序也会影响函数应用中的返回值,比如,

(( λy.λx.2*x+y) 1) 2 = (λx.2*x+1)2 =5

这便是语义.

这里也可以看到就是,函数的返回值也可以是一个函数,这样不同函数的层次问题也解决了,也就是传统数学中高阶函数、泛函的表示.在函数式编程语言中函数是一等公民与此也是一致的.

λ演算之所以被程序语言学家如此推崇,正是因为λ演算系统的构建过程就是一个程序语言从无到有的构建过程,整个系统中任何一个复杂的λ表达式都是由:λ抽象、应用和括号,粘合在一起的.*/

CATALOG