函數式編程

函數式編程是種編程典範,它將電腦運算視爲函數的計算。函數編程語言最重要的基礎是 λ 演算(lambda calculus)。並且λ演算的函數能夠接受函數看成輸入(參數)和輸出(返回值)。和指令式編程相比,函數式編程強調函數的計算比指令的執行重要。和過程化編程相比,函數式編程裏,函數的計算可隨時調用html

函數式編程是聲明式的。也就是說,她應該指定「什麼要作」而非「怎麼作」。這種方式使得咱們能夠工做更高的抽象層次。而傳統的過程式以及面向對象的語言,則是命令式的,於是更關注於「怎麼作」這個層面。站在面向對象思想的角度來看,函數式編程將函數當作一等公民的思想,使得咱們處理的粒度從類變小爲函數,從而能夠更好地知足系統對重用性和擴展性的支持。也就是說,咱們能夠從函數的粒度,而非對象的粒度去思考領域問題。算法

例如,有這樣一個場景:個人業務模型是個Person,已經有業務接口能返回給我全部Person的list集合,我須要把根據一些條件返回符合對應關係的Person。編程

 

特性

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

支持閉包和高階函數,支持惰性計算(lazy evaluation)。使用遞歸做爲控制流程的機制。增強了引用透明性。沒有反作用。我將重點放在在 Java 語言中使用閉包和高階函數上,可是首先對上面列出的全部特色作一個概述。框架

摺疊閉包和高階函數

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

摺疊惰性計算

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

摺疊遞歸

FP 還有一個特色是用遞歸作爲控制流程的機制。例如,Lisp 處理的列表定義爲在頭元素後面有子列表,這種表示法使得它本身天然地對更小的子列表不斷遞歸函數式編程

摺疊引用透明性

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

摺疊反作用

反作用是修改系統狀態的語言結構。由於 FP 語言不包含任何賦值語句,變量值一旦被指派就永遠不會改變。並且,調用函數只會計算出結果 ── 不會出現其餘效果。所以,FP 語言沒有反作用。優化

摺疊

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息