什么是 Functional ?
理解函数式,是理解函数式编程的关键。
上一篇提到的中英文对照版1,我已经整理完了。因此,我应该有底气来谈谈 Functional Programming ,严谨来讲是,谈谈 Functional 是什么了。
字面的困惑
若把英文 “Function” 映射为中文 “函数” 的话,那 “Functional” 就会是 “函数相关的”。可遗憾的是,即便我们对 “函数” 的理解是统一的,却很可能对 “函数相关的” 的理解是千差万别的。毕竟,“相关的” 的含义就是一个宽泛的指代。
这大概能解释,为什么从字面上去理解 Functional Programming ,总就有种 似是而非 的感觉了吧。反正在第一次接触这个概念时,我的理解是,编程尽量多的用函数呗。就好比,面向对象编程,就是尽可能用对象去编程😝。可是,面向对象写了这么多年的我们心里应该清楚,这样的理解,虽然谈不上错,但肯定不是答案的全部。
函数的形式
An FP system is founded on the use of a fixed set of combining forms called functional forms. 2
John Backus,Can Programming Be Liberated from the von Neumann Style? A Functional Style and Its Algebra of Programs
巴科斯认为,Functional Programming(FP)系统的本质是对一组函数的形式(functional forms)的应用。由此可见,函数式编程除了函数本身外,真正体现其编程优越性的是,函数的(组合)形式。若将其简化为,函数式,貌似也说得过去。这里的 “式” 不再泛指 “相关的” 或 “风格”,而是特指 “组合形式” 或 “表达式”。这么一来,函数式编程,可以简明扼要理解为,是一种 应用函数组合形式 的编程风格。
就这么简单吗?要是就这么简单,为什么围绕函数式编程有那么多不明觉厉的概念呢,像是:
- 纯函数
- 匿名函数
- 高阶函数
- 柯里化
- 延迟求值
- Monad
- ……
函数式编程的内核本就是简单的,这并意味着实现它(变得实用)也同样简单。毕竟,程序代码最终要变成能被冯·诺伊曼机执行的指令。
语言的败局
巴科斯在文中提到的函数式编程系统,至少在那个时候,只是一个理论上的系统,其对应的编程语言还未有实用的版本公开。甚至,直到2006年(他去世的前一年),在面对 Grady Booch 的采访时,他亲口承认在函数式编程语言上的工作失败了3。
函数式编程语言失败了吗?虽然不知道巴科斯是判定语言成功的标准具体是什么,但他的观点至少表明了,从系统理论到语言实用,期间的鸿沟是令人生畏的。
形式的重生
客观来讲,确实没有一个函数式编程语言(如 Haskell4、Ocaml5)成为过主流。可是,函数式编程的风格却在主流编程语言中得到了重生。例如,组合函数
compose
在 Javascript 中的实现:
function compose(f, g) {
return function(x) {
return f(g(x));
;
}
}console.log(
compose(
=> x * x,
x => x + 1
x 5)
)(
) // Output: 36
在巴科斯的函数式编程系统6里,这仅仅是函数式里最基础的一个,其余函数式同样能够用 Javascript 或其它主流编程语言实现。不信,你就试试吧!
最后
至此,关于函数式,我认为我已经讲清楚了。若你觉得意犹未尽,我依旧在此强烈推荐阅读我反复提到的巴科斯的文章7。除非你擅长厨艺,或是个美食家,那我推荐你看 Li Haoyi 写的这篇 “函数式风格的提拉米苏食谱”8。当然,留言或私信我,也是欢迎的。😉
https://github.com/zhongl/thinking-in-fp/tree/main/can-programming-be-liberated-from-the-von-neumann-style/chunked↩︎
https://github.com/zhongl/thinking-in-fp/blob/main/can-programming-be-liberated-from-the-von-neumann-style/chunked/11-functional-programming-systems.md#:~:text=An%20FP%20system%20is%20founded%20on%20the%20use%20of%20a%20fixed%20set%20of%20combining%20forms%20called%20functional%20forms.↩︎
https://twitter.com/Grady_Booch/status/1016041695501139968↩︎
https://github.com/zhongl/thinking-in-fp/blob/main/can-programming-be-liberated-from-the-von-neumann-style/chunked/11-functional-programming-systems.md#1124-%E5%87%BD%E6%95%B0%E5%BC%8F-bf-f↩︎
https://github.com/zhongl/thinking-in-fp/tree/main/can-programming-be-liberated-from-the-von-neumann-style/chunked↩︎