作为一名有追求的程序员,对于计算机基础的理论一定要有所了解。最近几年,随着分布式、云计算等技术的发展,函数式编程语言也趋于流行。如果要学习函数式编程,一定要深入理解它背后的理论知识。从收益的角度上讲,这些基础理论知识几十年不变,是十分值得花时间进行学习的。lambda演算(Lambda Calcus)就属于这样一套理论,可以说它在函数式编程领域就如牛顿万有引力定律一样基础。接下来这篇文章我将主要介绍lambda演算的基本知识,最后我还会用尝试用es6的箭头函数来演示如何利用lambda演算来实现编程语言中的基本组成要素。
lambda演算是什么?
要了解一个事物,先了解它的历史一定是重中之重。lamda表达式最初是由一个美国普林斯顿大学的数学家Alonzo Church在1932年所发明的。他也是"计算机科学之父"——图灵的博士生导师。
我们都知道现代的计算机基本上都是基于图灵机的。在图灵机中,所有的计算过程其实都是基于状态的,这也是为什么我们平常写代码要声明并使用变量的原因:变量主要作用就是用来存储状态。而Alonzo Church所提出的lamda演算(lamda calcus)模型实际上是基于函数的。图灵机模型和Lambda演算模型虽然是两种不同的理论模型,但它们实际上是等价的,这也意味着,任何基于图灵机的计算机程序都能等价地翻译成基于lambda演算模型的程序。
lambda演算是一套研究函数定义、函数应用和递归的形式系统。它基本的组成部分就是三种表达式: 1. 函数定义 2. 标识符引用 3.函数应用。
那么到底什么是lamda表达式呢,它又是由哪些基本组成要素构成的呢?我们都知道在函数式编程语言里面,最基本的组成单位就是函数。lambda表达式从定义上来讲可以看做是一个匿名的纯函数。ES6中引入了箭头函数,它的本质实际上就是我们这里所说的lambda表达式:
const lambda = x => x + 1;
实际上现在大部分的编程语言都引入了lambda表达式这一特性,如Java, c#和es6等。我们通常将lambda表达式,看作是一个黑盒,只关心它的输入和输出。由于没有内部状态,用函数式编程的思想写代码就与用命令式语言写代码截然不同。作为一个纯函数,每一次运行定义好的lambda表达式的时候,结果都应该是一致的。
在纯粹的lambda演算中实际上是没有任何内置的数据结构和逻辑控制语句的,但是我们可以使用函数来建构整个编程语言的所有要素。
lambda演算中的一些基本规则,可以类比到我们比较熟悉的ES6语法:
lambda表达式
ES6 箭头函数定义函数
λx.x
x => x
柯里化 curry
λx. λy.x+y
x => y => x + y
应用 application
(λx. λy.x+y) 5 1
(x => y => x + y) (5) (1)
如何实现
在实现具体的逻辑之前,我们