标签:
学习函数式编程的大图(big map)/鸟瞰图,并在没有掌握Scheme的各种语言细节之前,给出Scheme代码。这意味着我们不需要看懂源代码,而是将这里的介绍作为后续学习的大图,使自己知道身在何处;
1930s初,普林斯顿大学的逻辑学家阿伦佐·丘奇 (Alonzo Church,1903-1995) 开发出了一种新的形式系统(formal system),即拉姆达运算/演算 (λ-calculus 、lambda calculus ,lambda即希腊字母λ)。
λ运算的核心是λ表达式,以此形成函数定义、函数应用和递归的形式系统。当使用λ表达式定义出布尔值、数值和各种基本操作符等语言元素后,就能够形成一种编程语言,所以,λ运算是函数式编程语言共同的祖先,典型代表是Lisp(Scheme)、ML、Haskell和Erlang等等。
由于任何一个可计算函数都能用λ运算来表达和求值,因而它等价于图灵机。普通的数学函数如f(x)=x+1,功能是给其参数x加上1。为了将数学函数表示成计算机常用的表达式,可以换一种写法:
λx.( x+1),读成“对于参数x,x+1”(假定操作符+已经被定义)。丘奇选择了λ,因此各种相关计算称为λ演算。各种编程语言,也引入了λ表达式。例如:
C#语言:(x) =>{ return x+1; }
Java语言:(x) ->{ return x+1; }
Scheme语言:(lambda (x) (+ x 1))1. λ表达式的定义
λ表达式极其简洁,由变量、两个抽象符号λ和.(即点),以及括号( )组成。合法的λ表达式的递归定义如下:
通常,编程语言会提供内置的基本函数,如各种操作符。操作符的应用“是一种”函数应用,从λ表达式的递归定义的角度,“函数应用”规则可以得更直接的一条规则:
下面是一些λ表达式的例子:
(最简单的)x、y、
(函数抽象)λx.x、λx.y、
(函数应用)λx.x y、(x y)、λx. (x y)……
从λ表达式的定义,可以引申出它的两个特点:
函数式编程之根-λ表达式(lambda expression)
标签:
原文地址:http://blog.csdn.net/yqj2065/article/details/51345511