最近在看虎书的时候见到了函数式语言,随即想到了Lisp,和它的语言写法——即(write (+ 1 2))这类东西。Lisp语言受到过λ演算的启发,为了更好的理解下函数式,便去查找了下λ演算的资料——但是网上资料比较少,折腾了几日,把它们总结如下。
λ演算是阿隆佐邱奇(Alonzo Church)所发明的,那个时代还活跃着另一位科学家——阿兰图灵,就是发明图灵机的那位。λ演算和图灵机都做着相同的任务——计算,它是一个非常简单而且小巧的形式系统,简单理解,就像几何原本里面的几条公理,通过那几条公理,就像符号游戏一般,推导出整本书的所有定理、假设等等。这种有公理和能够进行推导的就是形式系统,自然地,描述它的就是形式语言。
在λ演算看来,一切都是表达式,包括函数——函数是抽象的表达式。它有三种合法的表达式,或者叫做项:
λ-term: 变量 Variable
首先是变量,是一个标识符,比如x、xy、var这些。注意,不要把变量理解为一个值,它可以代表任何东西,比如你认为平行线段永不相交,那么它就可以当作一个变量,并通过一系列操作推导出其它定理,当然,我们也可以用它表示一个值。
变量有着和一般程序语言类似的规则。当一个变量是在当前作用域下定义的,那么称它是绑定的(类比于局部变量),当一个变量是外层作用域定义的,但是本层作用域访问了,那么该变量是自由变量(类比逃逸变量)。注意,自由变量还是绑定变量是相对于作用域而言的——对于内层作用域,一个外层作用域的变量是自由的,而外层作用域则认为它是绑定的。
一个不含自由变量的项被称作封闭的,或者称为组合子。
λ-term: 抽象体 Abstraction
抽象体类似于函数