函數式編程語言(functional programming language):編程
一、什麼是函數式編程語言?併發
函數式編程語言(functional programming language)或稱函數程序設計,又稱泛函編程,是一種編程典範,它將計算機運算視爲數學上的函數計算,而且避免使用程序狀態以及易變對象。函數編程語言最重要的基礎是λ演算(lambda calculus)。編程語言
函數式編程語言的特徵:模塊化
(1)以「函數」爲首,如同命令式語言中的「變量」,函數能夠賦值給其餘變量,能夠做爲其餘函數的參數,或者做爲其餘函數的返回值。函數式編程
(2)不修改變量的值函數
(3)只有表達式,沒有語句。此處的語句指的是沒有返回值得某些操做。post
(4)引用透明(Referential transparency),函數的運行不依賴與外部變量或「狀態」,簡單的說就是,同一個輸入(參數),老是會產生同一個輸出(返回值),這與數學函數的特徵很一致。命令式語言由於全局變量等的存在,就沒法作到這一點。單元測試
(5)對比命令式語言,遞歸形式的循環。測試
二、函數式編程語言有哪些?spa
純函數式編程語言:
強靜態類型:Concurrent Clean、Haskkell、Miranda
弱類型:Lazy K
非純函數式編程語言:
強靜態類型:F#、ML、OCaml、Scala
強動態類型:Erlang、LISP、LOGOScheme、Clojure、Mathematica、R
強弱型:Unlambda
其餘函數編程語言:
APL、XSLT
三、函數式編程語言爲何會流行?
1. 代碼簡潔,開發快速。函數式編程大量使用函數,減小了代碼的重複,所以程序比較短,開發速度較快。
2. 接近天然語言,易於理解。函數式編程的自由度很高,能夠寫出很接近天然語言的代碼。
3. 更方便的代碼管理。函數式編程不依賴、也不會改變外界的狀態,只要給定輸入參數,返回的結果一定相同。所以,每個函數均可以被看作獨立單元,頗有利於進行單元測試(unit testing)和除錯(debugging),以及模塊化組合。
4. 易於"併發編程"。函數式編程不須要考慮"死鎖"(deadlock),由於它不修改變量,因此根本不存在"鎖"線程的問題。沒必要擔憂一個線程的數據,被另外一個線程修改,因此能夠很放心地把工做分攤到多個線程,部署"併發編程"(concurrency)。
5. 代碼的熱升級。函數式編程沒有反作用,只要保證接口不變,內部實現是外部無關的。因此,能夠在運行狀態下直接升級代碼,不須要重啓,也不須要停機。