大家好,又见面了,我是你们的朋友全栈君。
lamda -> L
lamda演算至少从表面上看,有着这样一种企图:
将所有运算操作,以及自然数都抽象成“函数”(再一次见识到函数这个概念的伟大)。下面简单的介绍下lamda演算
lamda演算的原始定义看起来比较无聊:
(Lx. [fx]) a = fa
上式用熟悉的概念翻译,就是自变量为x的函数f(x),代入x=a,得f(a)
但是这里有一个扩展:不仅f本身是函数,而且x和a也是函数!而且f也可以作为自变量,即
(Lf. [fx]) g = gx
至此,可以看出,“L”后面至“.”前面的符号其实就是自变量
接下来我们可以看看如何用这种定义表示自然数:
考虑复合函数的表示:
(Lf. [f(fx)]) g = g(gx)
如果做的更彻底一些,把x也当做自变量(没错,这就是二元函数的表示):
Lf. [Lx. [f(fx)]]
将上式缩写为
Lfx. [f(fx)]
并且将“2”的“函数”表达形式,定义为:
2 = Lfx. [f(fx)] (此时,”2″是一个函数而不仅仅是一个数字)
于是,我们有这么一个结论:2重复合函数表示“2”
类似地,我们得到其他自然数的定义:
3 = Lfx. [f(f(fx))]
4 = Lfx. [f(f(f(fx)))]
1 = Lfx. [fx]
0 = Lfx. [x]
… …
接下来,lamda演算的神奇之处在此展开:
考虑函数S = Labc. [b((ab)c)] 的用处,将3代入函数:
S 3
= Labc. [b((ab)c)] 3
= Lbc. [b((3 b)c)] (实际上即代入a = 3)
= Lbc. [b(b(b(bc)))]
= 4
可见,S的作用就是“+1”操作
上述函数S的神奇之处在于,运用完全抽象的函数运算,取代具体的算术运算。
【写于2012年11月】
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/138797.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...