在混沌纷繁的尘世中寻找真正想要的是什么
函数式编程是什么

从对编程的理解角度

命令式编程(例如面向对象),本质上是把计算机硬件抽象成一种逻辑语言

具体而言,变量们其实是内存中一个个地址,表达式其实是处理器当中的运算器,在命令式编程下,我们编程中调用的所有事物,都有其硬件对应,编程过程及其产物,是指挥和组织了一长串硬件指令序列。

相对而言,函数式编程对编程的理解不是硬件抽象,而是数学的抽象。函数式编程本质上是把数学抽象成一种逻辑语言,我们最后所编写的编程产物是一个数学函数,即函数式编程写出来的程序就是一个表达式。

数学函数是什么,要回到集合论,数学中的函数是一个映射机,当自变量从一个非空数集中取得一个值,通过对应法则,因变量就会映射到一个唯一的值。

函数式编程关心数据的映射,命令式编程关心解决问题的步骤。具体而言,命令式编程关心如何描述出解决问题的步骤,一步步使用已知的所有条件,去推理出想要的结果,而这些条件就是函数式编程所摒弃的万恶的状态。函数式编程关心映射,从数学角度,把结果视为输入的一种映射,没有什么状态,我们的编程过程只是写了映射法则,即函数里的对应法则,我们把函数里的对应法则抽象成计算机语言。

一个函数式编程的程序,想要得到运算结果,我们设计出一个函数表达式“结果=f(x,y,z)”,x,y,z是运算出结果所必须的要素,然后要素可能是由其它要素所运算得出的,我们于是把要素替换成值或表达式,最终整个结果函数就像一个大的复合函数一样,也就是“结果=f(f2(a),f3(b),f4(f5(c),f6(d)))”,我们通过这样一大串函数算出结果。

也因此,函数式编程是更接近人类语言而不是机器语言那一侧的。

从对“运行时”的理解角度

我们知道一般的程序如今一般运行在冯诺依曼计算机上,冯诺依曼计算机就是程序的运行时(即运行环境),但函数式编程的程序并非运行在冯诺依曼计算机上(虽然事实最终是运行在冯诺依曼计算机上),函数式编程运行在λ演算上。

函数式编程运行在λ演算上,就像 Java 程序运行在 JVM 虚拟机中。

λ演算是一种图灵完备的形式语言,作为一种计算模型,拥有足够的计算能力来表达任何可计算函数,或者说,能够模拟任何一台图灵机。

我们学习的数学语言,所有的语法和元素只是数学家约定俗成的一些记号,虽然是一种约定的形式系统,但非一种严谨的形式系统(不少数学家发明过自己的符号),因此我们需要重新发明一种严谨的形式系统来重新描述这一切,尤其是像发明一种编程语言一样,定义一种严谨的数学语言,以重新描述函数。

严谨是非常重要的,λ演算是一种严格的图灵完备的数学形式系统,严谨是其最大的底色,计算机当中如果什么都明确,就不会有大问题。

具体提升包括,保证正确性、自动处理好并发、没有歧义、安全性等等。一种极致死板的形式语言可能对人甚至有缺点,但对计算机而言有很多优点。

而函数式编程语言的工作,是把整个λ演算形式系统给程序化,函数式编程语言让λ演算作为一层“虚拟机”,把每个语句理解为λ演算语句。

具体而言,高级编程语言参考了λ演算系统,从中借鉴了许多关键概念和设定,并将这些概念整合、转化进自身的特性和设计中。最终,让λ演算成为一层“虚拟机”,程序员编写高级语言,高级语言把程序理解为λ演算,最后把λ演算交给计算机计算。

包括但不限于在高级语言中,实现了λ演算中的尾递归优化、单子、柯里化、闭包、惰性列表和流等设定。

优点

函数式编程的程序,既不依赖外部状态,也不改变外部状态,只要指定输入,根据设计好的映射法则,就会得到想要的输出,小到函数是无状态的,大到进程是无状态的,所以不会争抢资源,这种无状态程序的一大优点是完美适合并发。

除此之外,还有代码模块化程度提升、编译器优化程度提升、λ演算作为一层虚拟机令程序跨平台性提升、安全性提升等等。

速通Lambda 演算形式系统语法和概念
© 2024 Dal
「 就在那个时刻,你记得这并非幻觉,的确就在那个时刻,那只手和那块石头的接触面,她突然回过头冲你说:我也爱着你。 」