函数式编程本质的思考

时间:2021-07-23 22:40:35

很早就了解函数式编程的概念,今天忽然觉得若有所悟,写点东西放这儿。

1、无变量程序设计,一切皆为常量

我觉得这才是函数式编程的关键。在学习数学课程时,我们的解题过程会用字母去表示各种各样的数据,例如“令 x = 1”这种说法,是一种定义,并非程序设计语言中的赋值语句。

2、想不起来还应该具备其他什么特征了

函数式编程中,我们是描述函数的定义方法,而不是用计算机如何计算结果,这个是本质性的东西。至于其他特征,我觉得都是这个本质带来的一些“福利”而已,这里列举一些:

2.1 函数是函实式编程的第一型

本老朽愚钝,始终无法理解这句话的本意,是动不动就拿出来忽悠人的虎皮吧。我觉得理想的函数式编程语言,其中的一切应该皆为函数吧。比如,数字1,是不是可以理解为如下函数?

int 1() {
  return 1;
 }

当然,总有一些函数是无需定义的“公理”,基本数据类型就算是这一类“原子函数”吧。既然一切皆函数,函数的参数和返回值理所当然也是函数。

2.2 无状态编程

没了变量,状态变化如何保存?如果系统需要保存状态,内核一定需要一个能保存数据的系统来做这件事情,比如数据库系统。一个简单的例子,如果编程语言不支持变量,如果不借助外部 io 设备,类似 rand() 这样的随机数函数,也是无法通过纯函数式编程实现的,因为 rand() 不符合数学中函数定义。

简单地讲,传统的三层架构:表现层+业务逻辑层+数据层这样的体系中,数据层(如果包括数据库的话)应该是有状态的;业务逻辑层是可以做成无状态的;表现层是用户界面,目前都是OOP模型,想做成无状态不太可能。

函数式编程思想的有价值之处在于,在系统设计时,应该把有状态的子系统剥离紧缩到最小的体积,尽可能把系统设计成无状态形式。因此,函数式编程用于服务器端业务逻辑层的设计应该是最合适的。像Redis这样的内存数据库系统,不可能用纯粹的无变量函数式编程来实现。

我也想过利用闭包实现 rand(), 好像不用变量的话也实现不了。这一点,谁要是有好的想法可以告诉我。

2.3 并行计算

函数式编程无变量,适合并行计算,因此在多处理器时代受到大家关注。函数式编程有一种延迟计算技术,可以有效利用并行计算:

    a = calc_a();
    b = calc_b();
    c = a + b;

采用延迟计算技术,前两句不会立即执行,到第三句时,会触发并行计算同时计算 a、b 的值,实现并行计算。