什麼是函數編程?

轉載自 http://www.ibm.com/developerworks/cn/java/j-fp/

        在經常被引用的論文 “Why Functional Programming Matters”(請參閱 參考資料) 中,作者 John Hughes 說明了模塊化是成功編程的關鍵,而函數編程可以極大地改進模塊化。在函數編程中,編程人員有一個天然框架用來開發更小的、更簡單的和更一般化的模塊, 然後將它們組合在一起。函數編程的一些基本特點包括: 

  • 支持閉包和高階函數。

  • 支持懶惰計算(lazy evaluation)。

  • 使用遞歸作爲控制流程的機制。

  • 加強了引用透明性。

  • 沒有副作用。

     

首先對上面列出的所有特點做一個概述。

 

閉包和高階函數

函數編程支持函數作爲第一類對象,有時稱爲 閉包或者 仿函數(functor)對象。實質上,閉包是起函數的作用並可以像對象一樣操作的對象。與此類似,FP 語言支持 高階函數。高階函數可以用另一個函數(間接地,用一個表達式) 作爲其輸入參數,在某些情況下,它甚至返回一個函數作爲其輸出參數。這兩種結構結合在一起使得可以用優雅的方式進行模塊化編程,這是使用 FP 的最大好處。

 

懶惰計算

除了高階函數和仿函數(或閉包)的概念,FP 還引入了 懶惰計算的概念。在懶惰計算中,表達式不是在綁定到變量時立即計算,而是在求值程序需要產生表達式的值時進行計算。延遲的計算使您可以編寫可能潛在地生成無窮輸出的函數。因爲不會計算多於程序的其餘部分所需要的值,所以不需要擔心由無窮計算所導致的 out-of-memory 錯誤。一個懶惰計算的例子是生成無窮 Fibonacci 列表的函數,但是對 第 n 個Fibonacci 數的計算相當於只是從可能的無窮列表中提取一項。

 

遞歸

FP 還有一個特點是用遞歸做爲控制流程的機制。例如,Lisp 處理的列表定義爲在頭元素後面有子列表,這種表示法使得它自己自然地對更小的子列表不斷遞歸。

 

引用透明性

函數程序通常還加強 引用透明性,即如果提供同樣的輸入,那麼函數總是返回同樣的結果。就是說,表達式的值不依賴於可以改變值的全局狀態。這使您可以從形式上推斷程序行爲,因爲表達式的意義只取決於其子表達式而不是計算順序或者其他表達式的副作用。這有助於驗證正確性、簡化算法,甚至有助於找出優化它的方法。 

 

副作用

副作用是修改系統狀態的語言結構。因爲 FP 語言不包含任何賦值語句,變量值一旦被指派就永遠不會改變。而且,調用函數只會計算出結果 ── 不會出現其他效果。因此,FP 語言沒有副作用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章