上图是 Lisp 的图片,感受一下图片符号的魅力。
为什么我说是曙光?
是因为,并没有真正的胜利。此时的 LISP 依旧是工作在冯·诺依曼计算机上,因为当时只有这样的计算机系统。
所以从 LISP 开始,函数式语言就是运行在解释环境而非编译环境中的。也就是传说中的脚本语言,解释器语言。
6、真正的胜利直到 1973 年,MIT 人工智能实验室的一组程序员开发了,被称为 LISP 机器的硬件。自此,阿隆左·丘奇的 lambda 演算终于得到了 硬件实现。终于有一个计算机(硬件)系统可以宣称在机器指令级别上支持了函数式语言。
7、总结关于这问,我阐述了很多,从函数式语言诞生的目的、到函数式语言诞生的艰难过程、再到计算机硬件的限制。最后在不断的努力下,做到了既可以通过解释器,完成基于冯·诺依曼体系下,计算机系统的函数式编程。也可以在机器指令级别上支持了函数式语言的计算机上进行纯正的函数式编程。
思考题:想一想,在如今,函数式编程为什么越来越被人所了解和掌握。
二、lambda 演算系统是啥?lambda 具体说的是啥内容?lambda 和函数有啥联系?为啥会有 lambda 演算系统 1、lamda 诞生的目的lambda 是一种解决数学中的函数语义不清晰,很难表达清楚函数的结构层次的问题的运算方案。
也就是在运算过程中,不使用函数中的函数运算形式,而使用 lambda 的运算形式来进行运算。
2、lamda 简单介绍(1)一套用于研究函数定义、函数应用和递归的系统。
(2)函数式语言就是基于 lambda 运算而产生的运算范型。
3、函数式编程的理论基石lambda 演算系统是学习函数式编程的一个非常重要的知识点。它是整个函数式编程的理论基石。
4、数学中的函数如下图所示:
从上面的数学函数中,我们可以发现以下几点:
没有显示给出函数的自变量
对定义和调用区分不严格。x2-2*x+1 既可以看成是函数 f(x) 的定义,又可以看成是函数 g(x) 对变量 x-1 的调用。
体会上面几点,我们会发现:数学中的函数语义并不清晰,它很难表达清楚函数的结构层次。对此,邱奇给出了解决方法,他提出了 lambda(λ) 演算。
5、lambda(λ) 演算基本定义形式:λ<变量>.<表达式>
通过这种方法定义的函数就叫 λ(lambda) 表达式。
我们可以把 lambda 翻译成函数,即可以把 lambda 表达式念成函数表达式。
PS: 这里说一下,函数式语言中的函数,是指 lambda(函数),它和我们现在的通用语言中,比如 C 中 的 function 是不同的两个东西。
6、单个变量的栗子 λx.x2-2*x+1 就是一个 λ 表达式,其中显式地指出了 x 是变量。将这个 λ 表达式定义应用于具体的变量值时,需要用一对括号把表达式括起来,当 x 是 1 时,如下所示:(λx.x2-2*x+1)1
应用(也就是调用)过程,就是把变量值赋值给表达式中的 x ,并去掉 λ <变量>,过程如下:
(λx.x2-2*x+1)1=1-2*1+1=0
7、多个变量的栗子表达式 λx.λy.x+y 中,有两个变量 分别为 x 和 y。
当 x=1, y=2 表达式调用过程如下:
((λx.λy.2*x+y)1)2 = (λy.2+y) 2 = 4
从上面,我们可以看到,lambda 表达式的调用中,参数是有执行顺序的,能感受到柯里化和组合的味道。
也就是说,由于函数就是表达式,表达式就是值。所以函数的返回值可以是一个函数,然后继续进行调用执行,循环往复。
这样,不同函数的层次问题也解决了,这里用到了高阶函数。在函数式编程语言中,当函数是一等公民时,这个规律是生效的。
8、总结说到这,大家从根本上对函数式编程有了一个清晰的认知。比如它的数学基础,为什么存在、以及它和命令式语言的本质不同点。
lambda 演算系统 证明了:任何一个可计算函数都能用这种形式来表达和求值,它等价于图灵机。