就以上幾點,我編了一首打油詩:java
函數編程很強大 一等公民都是它 外部變量不依賴 返回確保串行化
串行化什麼意思呢?
一樣計算(1+2)*3/4
,java代碼以下:程序員
int a = 1 + 2 int b = a * 3 int c = b / 4
而Scala寫出來以下:編程
val r = subtract(multiply(add(1, 2), 3), 4)
如此,就能夠很簡單的改寫爲:設計模式
val r = add(1, 2).multiply(3).subtract(4)
其中的美妙本身體會吧~~~安全
有機會看到這篇文章的讀者,大概都會知道阿蘭·圖靈(Alan Turing)和約翰·馮·諾伊曼(John von Neumann)。阿蘭·圖靈提出了圖靈機的概念,約翰·馮·諾伊曼基於這一理論,設計出了第一臺現代計算機。多線程
因爲圖靈以及馮·諾伊曼式計算機的大獲成功,歷史差點淹沒了另一位一樣傑出的科學家和他的理論,那就是阿隆佐·邱奇(Alonzo Church)和他的λ演算。閉包
阿隆佐·邱奇是阿蘭·圖靈的老師,上世紀三十年代,他們一塊兒在普林斯頓研究可計算性問題,爲了回答這一問題,阿隆佐·邱奇提出了λ演算,其後不久,阿蘭·圖靈提出了圖靈機的概念,儘管形式不一樣,但後來證實,兩個理論在功能上是等價的,條條大路通羅馬。併發
若是不是約翰·麥卡錫(John McCarthy),阿隆佐·邱奇的λ演算恐怕還要在歷史的故紙堆中再多躺幾十年,約翰·麥卡錫是人工智能科學的奠定人之一,他發現了λ演算的珍貴价值,發明了基於λ演算的函數式編程語言:Lisp,因爲其強大的表達能力,一推出就受到學術界的熱烈歡迎,以致於一段時間內,Lisp 成了人工智能領域的標準編程語言。編程語言
很快,λ演算在學術界流行開來,出現了不少函數式編程語言:Scheme 、SML、Ocaml 等,可是在工業界,仍是命令式編程語言的天下,Fortran、C、C++、Java 等。函數式編程
隨着時間的流逝,愈來愈多的計算機從業人員認識到函數式編程的意義,愛立信公司於上世紀八十年代開發出了 Erlang 語言來解決併發編程的問題;
在互聯網的發展浪潮中,愈來愈多的語言也開始支持函數式編程:JavaScript、Python、Ruby、Haskell、Scala 等。
能夠預見,若是過去找一個懂什麼是函數式編程的程序員很困難,那麼在不久的未來,找一個一點也沒聽過函數式編程的程序員將更加困難。
對於面向對象,咱們已經再熟悉不過了,因此這裏不作過多介紹,直接分析它的優缺點.
面向對象程序設計能夠看做一種在程序中包含各類獨立而又互相調用的對象的思想(抽象現實世界),這與傳統的思想恰好相反。
傳統的程序設計主張將程序看做一系列函數的集合,或者直接就是一系列對電腦下達的指令。
面向對象程序設計中的每個對象都應該可以接受數據、處理數據並將數據傳達給其它對象,所以它們均可以被看做一個小型的「機器」,即對象。
目前已經被證明的是,面向對象程序設計推廣了程序的靈活性和可維護性,而且在大型項目設計中廣爲應用。
此外,支持者聲稱面向對象程序設計要比以往的作法更加==便於學習==(因此易於推廣),由於它可以讓人們更簡單地設計並維護程序,使得程序更加便於分析、設計、理解。
同時它也是易拓展的,因爲繼承、封裝、多態的特性,天然設計出高內聚、低耦合的系統結構,使得系統更靈活、更容易擴展,並且成本較低。
在面向對象編程的基礎上發展出來的23種設計模式普遍應用於現今的軟件工程中,極大方便了代碼的書寫與維護。
下面咱們在看看函數式編程(FP)
狹義地說,函數式編程沒有可變的變量、循環等這些命令式編程方式中的元素,像數學裏的函數同樣,對於給定的輸入,無論你調用該函數多少次,永遠返回一樣的結果。而在咱們經常使用的命令式編程方式中,變量用來描述事物的狀態,整個程序,不過是根據不斷變化的條件來維護這些變量。
廣義地說,函數式編程重點在函數,函數是這個世界裏的==一等公民==,函數和其餘值同樣,能夠處處被定義,能夠做爲參數傳入另外一個函數,也能夠做爲函數的返回值,返回給調用者。利用這些特性,能夠靈活組合已有函數造成新的函數,能夠在更高層次上對問題進行抽象。本文的重點將放在這一部分。
函數式編程和麪向對象編程各有利弊,一個語法更加自由(FP),一個健壯性更好(OOP)。做爲程序員應該對兩種編程方式都有所瞭解,無論是哪一種方式,只要可以很好的解決當前的問題就是正確的方式,畢竟對於軟件工程來講解決問題是最主要的,用的工具反而沒有那麼重要,就像對程序員來講語言不重要,重要的是解決問題的思想。
如今這二者的發展趨勢是相互借鑑的,許多以面向對象做爲基礎的語言例如Java等都在新的版本中添加了對函數式編程的支持,而函數式編程則借鑑了一些在面嚮對象語言裏用的一些編譯技巧使得程序運行更快。
約翰·巴克斯(John Backus)爲人熟知的兩項成就是 FORTRAN 語言和用於描述形式系統的巴克斯範式,由於這兩項成就,他得到了 1977 年的圖靈獎。
有趣的是他在獲獎後,作了一個關於函數式編程的講演:Can Programming Be Liberated From the von Neumann Style? 1977 Turing Award Lecture。他認爲像 FORTRAN 這樣的命令式語言不夠高級,應該有新的,更高級的語言能夠擺脫馮諾依曼模型的限制,因而他又發明了 FP 語言,雖然這個語言未獲成功,可是約翰·巴克斯關於函數式編程的論述卻獲得了愈來愈多的承認。下面,咱們就羅列一些函數式編程的優勢。
首先,函數式編程自然有併發的優點。因爲工藝限制,摩爾定律已經失效,芯片廠商只能採起多核策略。程序要利用多核運算,必須採起併發,而併發最頭疼的問題就是共享數據,狹義的函數式編程沒有可變的變量,數據只讀不寫,併發的問題迎刃而解。這也是前面兩篇文章中,一直建議你們在定義變量時,使用 val 而不是 var 的緣由。愛立信公司發明的 Erlang 語言就是爲解決併發的問題而生,在電信行業取得了不俗的成績。
其次,函數式編程有跡可尋。因爲不依賴外部變量,給定輸入函數的返回結果永遠不變,對於複雜的程序,咱們能夠用值替換的方式(substitution model)化繁爲簡,輕鬆得出一段程序的計算結果。爲這樣的程序寫單元測試也很方便,由於不用擔憂環境的影響。
最後,函數式編程高屋建瓴。寫程序最重要的就是抽象,不一樣風格的編程語言爲咱們提供了不一樣的抽象層次,抽象層次越高,表達問題越簡潔,越優雅。讀者從下面的例子中能夠看到,使用函數式編程,有一種高屋建瓴的感受。