lambda
lambda
在计算机编程语言中,如Lisp,Python和Ruby, λ是一个算子,用于表示匿名函数或者闭包,后跟λ演算的用法。
在C#编程语言中,一个λ表达式是一个包含表达式和语句的匿名函数。
非λ语言是一种基于组合逻辑的函数式编程语言,一个简单化的λ演算并不包含λ所有的内容,
lambda term
一个有效的lambda表达式被称为lambda term。
规则:
一个变量x,那么它自己(x)就是一个有效的lambda term;
如果t是一个lambda term,并且x是一个变量,那么(λx.t)也是一个lambda term(被称为lambda abstraction)。
如果t和s都是lambda term,那么(ts)也是一个lambda term(被称为application)。
怎么去理解application, 可以理解为“apply”:如Java中java.util.function.Function定义:
R apply(T t);
public class Fx implements Function<String, String> {
public String apply(String s) {
return s;
}
}
Fx fx = new Fx();
fx.apply("this is input");
javascript的例子:
function fx(x) {console.log(x); return x;};
fx.apply(this, ["this is input"]);
this is input
"this is input"
这样也能调用到:
function fx(x) {console.log(x); return x;};
fx.apply("this is input", ["this is actual input"]);
this is actual input
"this is actual input"
function fx(x) {console.log(x); return x;};
fx.apply(null, ["this is actual input"]);
this is actual input
"this is actual input"
function fx(x) {console.log(x); return x;};
fx.apply(undefined, ["this is actual input"]);
this is actual input
"this is actual input"
function fx(x) {console.log(x); return x;};
fx.call(this, "this is input");
this is input
"this is input"
例如:
(def size 48)
它定义了一个变量size, 对应规则1,那么变量size就是一个有效的lambda term。
定义了一个变量,对应规则2:(λx.t),抽象为:绑定变量x到t, 也就是将48绑定到size上。那么(def size 48)整个是一个lambda term。
Lambda表达式
Lambda表达式由:
一组变量v1,v2,…,vn,…
抽象符号lambda ‘λ’以及点’.’
圆括号’()’
Lambda表达式集合(Λ),可以归纳定义为:
1、如果x是一个变量,那么x包含于Λ
2、如果x是一个变量,并且M包含于Λ,那么(λx.M)包含于Λ
3、如果M,N包含于Λ,那么(M N)包含于Λ
规则2的实例称为抽象(abstractions),规则3的实例称为具体(applications)
Lambda表达式
标记法
为了使Lambda表达式的标记法变得整洁,以下变换经常被应用:
最外面的圆括号被去掉:使用M N代替(M N)
具体(Applications)被假定为左关联:M N P可写为((M N) P)
抽象体扩展延伸为尽可能最右关联: λx.M N表示λx.(M N)而非(λx.M) N
抽象序列被缩写: λx.λy.λz.N 可缩写为λx.y.z.N
释放和绑定变量
归约
Lambda表达式的意义被定义为怎么对表达式进行归约。
有三种方式:
α变换(α-conversion) 改变绑定变量 (alpha)
β归约(β-reduction) 将函数应用到参数上 (beta)
η变换(η-conversion) 关注外延性概念 (eta)
Lambda表达式
α变换
α变换( α-conversion , Alpha-conversion ) 有时候也被称为alpha-renaming
α变换允许改变绑定变量名
λx.x可能产生λy.y.
Lambda表达式
β归约
β归约(β-reduction, Beta-reduction ) 也可以叫做β消解
β归约规则表达的是函数作用的概念。
Lambda表达式
表现形式
Java在1.8后支持Lambda, Lambda表达式表现形式:
private static void usage() {
new Thread(() -> System.out.println("Java8 Lambda expression")).start();
}
它体现在() -> System.out.println("Java8 Lambda expression")对应(λx.t),其中()表示输入(x), System.out.println("Java8 Lambda expression")表示将输入的(),也就是x,替换为System.out.println("Java8 Lambda expression"),这个过程就是β-reduction。
interface Plus {
public int invoke(int x, int y);
}
private static void add() {
int x = 10;
int y = 30;
Plus xpy = (xx, yy) -> xx + yy;
System.out.println(xpy.invoke(x, y));
}
λ 演算
λ 演算(Lambda calculus)完全等价于图灵机,也就是说, λ 演算是图灵机完备的,它是一个通用的计算模型,可以用来模拟任何用单个胶带或磁盘录下来的图灵机。
Lambda(希腊字母λ)用于Lambda表达式(lambda expressions)及lambda terms用于在函数中表示一个变量绑定。
λ 演算可能是typed或者untyped。
在typed λ 演算中,函数可以被应用于
<!--[if !supportLists]-->• <!--[endif]-->https://en.wikipedia.org/wiki/Lambda_calculus
<!--[if !supportLists]-->• <!--[endif]-->https://en.wikipedia.org/wiki/Lambda_calculus_definition