函数式编程另类指南(转)

来自erlang-china的一篇翻译文章:函数式编程另类指南,其中从哲学方面谈到了如何理解函数,很有意思,写些个人感概如下:

“世界上没有完美的事物,完美的数学形式只能 存在于另一个世界,我们通过和那个世界的某种联系在一定程度上知晓他们。”

很显然,这段话如果从显式和隐式这个阴阳概念出发很好理解,数学是一种形式,一种显式的形式,现实世界是一种隐式,我们试图通过数学显式形式来表达现实世界,但是数学不是唯一的显式形式。

数学形式和其他形式有什么区别?比如我们中国人古代也有表达世界的形式,比如五行等等:“我们设置了一系列基本的不冲突的原理和一些可以施加于这些原理的操作规则,然后我们就能堆砌这些规则以形成更复杂的规则。数学家把这种方法叫做“形式 系统”或“演算”。”

阿隆左·丘奇提出 lambda 演算的形式系统:以函数为参数和返回值的函数。函数用希腊字母 lambda 标识。

阿兰·图灵也在进行着相似的工作,他提出了一个不同的形式系统(现在被称为图灵机),后来被证明图灵机和 lambda 演算能力等同。

在函数式世界中,一切都是函数,正如对象世界中一切都是对象一样,变量在函数式编程中只是表达式的别名,变量是函数的表面名称而已,隐式实质还是函数,变量是不可变的,是一种值对象,用Java意思是final。

变量如果不可变,状态改变怎么办呢?只是它并非通过变量而是使用函数来保存状态。状态保存在函数的参数中,保存在堆栈上。通过递归函数不断修改状态。

这样好像比较愚蠢的方式其实有很多优点:

函数式程序适合并行计算,因为无需任何修改就无需锁,无需星形共享,不用担心死锁和临界区,函数式程序里没有任何数据被同一线程修改两次,更不用说两个不同的线程了。


[该贴被banq于2012-05-24 10:59修改过]