在過去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個單詞進行重新定義,開頭定義到:
函數式編程是一種編程范式,把計算看作是一種數學函數計算。與命令式編程相比,tb函數式編程關注的是函數表達式的計算而不是執行命令。在這些語言上,表達式把函數與基本功能相結合。
在這一點上,函數式編程并不強調函數的使用,相反,它意味著編程要與數學函數相結合。在這個定義里還隱藏著另外一個意思:函數越來越純粹。這一條在定義里并沒有明確的表達出來。直到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庫來說,都是如此。結果就是,程序在一個范圍內可以很方便地編寫比較單一的功能與風格,但這也是相當有限的。