转 函数式编程的10年演化:越来越纯

在过去10年中,函数式编程的定义一直在慢慢改变,在“Wikipedia page on Functional Programming”上可以显著地反映出来。

在2003年8月14号之前的定义是:函数式编程作为一种模式,强调函数的使用。例如在2011年10月14号,维基百科用了220个单词进行定义,在开头这样描述到:

函数式编程是一种编程风格,它关注的是函数表达式的计算,而不是执行命令。在这些语言上,表达式把函数与基本功能相结合。

函数式编程语言是一种支持和鼓励将电脑运算当成函数计算,比较古老的函数式编程莫过于Lisp,较现代的Scheme,ML,Haskell,Erlang,Clean。Lisp是第一个函数式编程语言,它和Scheme,ML,Haskell一样。

这样的定义一直维持到2003年8月14号,新百科全书在内容制作上有了结构化调整。Luxor把新百科全书的定义与维基百科相融合,创建了一个新的页面并且用了1640个单词进行重新定义,开头定义到:

函数式编程是一种编程范式,把计算看作是一种数学函数计算。与命令式编程相比,函数式编程关注的是函数表达式的计算而不是执行命令。在这些语言上,表达式把函数与基本功能相结合。

在这一点上,函数式编程并不强调函数的使用,相反,它意味着编程要与数学函数相结合。在这个定义里还隐藏着另外一个意思:函数越来越纯粹。这一条在定义里并没有明确的表达出来。直到2006年5月29号:

函数式编程是一种编程范式,把计算看作是一种数学函数计算。函数式编程关注的是函数定义而不是实现状态机,与过程式编程相比,它强调命令的连序执行。一个纯函数程序不会去修改状态产生的值(适用于命令式编程),它会构造新的值(但不会覆盖现有值)。

对函数式编程或函数式编程语言没有统一的共识。函数式编程语言的重要特征:高阶和一级函数、闭包、递归。其他还包括编程语言连续性、Hindley-Milner类型诊断系统、懒惰计算和单体。

这里还有一些小区别,关于(普通)函数编程和“纯”形式的函数编程,避免使用不稳定的状态。在2006年5月29号01:07分,在没有任何征兆的情况下,一个叫ideogram的用户进行了微小但是非常有意义的修改:

  • 函数式编程是一种编程风格,把计算看作是一种数学函数计算并且避免状态和可变数据。
  • 函数式编程关注函数定义,与过程式编程相比,它强调命令的连序执行。
  • 函数式编程的依赖λ演算(lambda calculus),Lisp和较新的Haskell。常常提到的是避免状态和副作用(它提供对引用透明),高阶函数,递归和闭包。

该账户仅仅在编辑前几天创建,后来就一直处于禁止状态。

最近,也就是在2012年7月14号,定义页面又出现了新的变化:

在计算机科学领域,函数式编程是一种编程范式,把计算看作是一种数学函数计算并且避免状态和可变数据。它强调函数的应用,与命令式编程语言相比,强调状态的变化。函数式编程根源于λ 演算,一个正式的函数式编程系统在20世纪30年代被开发,用来研究函数的定义,函数的应用和递归。许多函数式编程语言可以看作是对λ演算进行的阐述。

在实际操作中,数学函数和“函数”概念之间在命令式编程上的差异主要表现为命令式函数编程存在改变程序状态值这一缺点。因此,他们缺乏引用透明,相同的语言表达式根据执行应用程序状态,在不同的时间可以产生不同的值。相反,在函数代码上,函数的输出值仅仅依赖于函数的输入参数,所以,输入同一个参数X两次,那么输出结果都是Y。消除副作用也更容易理解和预测程序的行为,这是函数编程语言发展的一个重要推动。

[1]Hudak, Paul。“概念, 发展和函数式编程语言的应用”。ACM Computing Surveys 21 (3): 359–411。上述内容的含义是什么?这一变化是如何产生的?我们正卷入一场(小的)科学革命中,幕后推手又是谁?

根据最新的定义,ML和Lisp不在是函数式语言。用这些语言的子函数去写一些程序来避免可变状态的使用。第一个需求是在ML中使用“ref”或者在Lisp中使用分配和构造突变。然而,对于ML和Lisp来说并不足够,许多标准库都存在负面作用,对于任何IO库来说,都是如此。结果就是,程序在一个范围内可以很方便地编写比较单一的功能与风格,但这也是相当有限的。

posted @ 2012-07-25 14:15  Marvin  阅读(277)  评论(0编辑  收藏  举报