函數式編程的興衰(Composing Software 1)

最近都在緊張的準備期末,而後爲即將開始的19屆實習春招在panic,以爲本身好慌,找不到實習怎麼辦)javascript

不過發現了以前翻譯過文章,這個是一個系列的文章,也算是我函數式編程的入坑之做吧java

只是翻譯了第一篇,第二篇第三篇都在progress中,你們有興趣的話我就就陸續放出來吧編程

沒有就接着坑了。。。數組

我六歲的時候很喜歡和個人朋友玩電腦遊戲。他家有一個專門的房間放滿電腦。對於我來講,他們家就像一片魔法天地吸引着我。在花了不少時間玩過不少遊戲後,我問個人朋友,」咱們該怎麼作一款出來呢?「bash

他也不知道,因此咱們去問了他爸爸,他爸爸從書架高處拿下一本用Basic寫遊戲的書。因此我開始了個人編程之旅。在學校開始教代數的時候,我早就學過了,由於編程就是代數。app

組合式程序(Composing Software)的興起

在計算機科學初期,在不少計算機科學理論在電腦上實踐在電腦上以前,有兩個偉大的計算機科學家:Alonzo Church和 Alan Turing。他們發明了兩種不一樣可是都被普遍使用的計算模型。兩個模型均可以將任何可計算的模型計算。函數式編程

Alonzo Church 發明了λ演算。λ演算是一個基於函數應用的廣泛模型。Alan Turing以圖靈機著稱,圖靈機是一個在一卷膠帶定義了設備和操做符的廣泛模型。函數

在這兩組模型的合做中展現了,其實兩種模型在功能上是異曲同工的。post

λ演算主要是關於函數組合。從函數組合的角度來思考問題,是很是直觀的,並且對於組合程序很是有效的。在接下來,咱們將討論函數組合在程序設計中的重要性。學習

說λ演算很特別一下有三個理由:

  1. 函數一般是匿名的。在JavaScript裏面, const sum = (x, y) => x + y 的右操做數是一個匿名函數表達式。
  2. 在λ演算中函數只接受單一輸入,是一元的。若是你須要更多的參數,那麼函數會接受一個輸入後返回一個新的函數,來接受新的參數。多元函數(x, y) => x + y 能夠表示爲x => y => x + y 這樣的一元函數。這樣的變化被稱爲編程的柯里化(currying)
  3. 函數是第一級的,這意味着函數能夠用來做爲其餘函數的輸出,函數能夠返回函數。

這些特性就賦予了組合式程序,使用函數做爲基礎構建模塊的能力。在JavaScript裏面,匿名函數和柯里函數都是可用的特性。鑑於JavaScript有着這些λ演算的特性,因此就能夠恰當的使用λ演算模型。

經典的函數組合會從一個函數的輸出提取輸入進另一個函數,舉個例子,這樣的組合:

f . g
複製代碼

能夠這樣寫:

compose2 = f => g => x => f(g(x))
複製代碼

就能夠這樣用:

double = n => n * 2
inc = n => n + 1
複製代碼
compose2(double)(inc)(3)
複製代碼

compose2()接收了double做爲第一個參數,以後接收了inc做爲第二個參數,最終爲這個組合的函數接收了3做爲參數。再來看看compose2() 的簽名, fdouble(), ginc(), 而後 x3。最後採用了compose2(double)(inc)(3)的調用,其實是三個不一樣的函數調用:

  1. 首先接收了double後返回了一個新的函數。
  2. 以後函數接收了inc返回了一個新的函數。
  3. 新的函數接收了 3 而後執行了 f(g(x)), 如今就是double(inc(3)).
  4. x 等於 3 以後傳入 inc().
  5. inc(3) 等於 4.
  6. double(4) 等於 8
  7. 8 最終被函數返回。

當程序被組成化後,他能夠形象的用圖像表示函數組合過程。舉個例子:

append = s1 => s2 => s1 + s2
append('Hello, ')('world!')
複製代碼

能夠被這樣表示:

img

λ演算對程序設計產生了巨大的影響,直到1980年,有許多基於組合函數的計算機科學研究成果。Lisp誕生於1958年,就受到了λ演算很大的影響。現在使用的語言中,Lisp依然是一門第二老的語言。

我是經過AutoLISP瞭解的Lisp。AutoLISP是一個用於CAD語言。AutoCAD廣受歡迎固然支持AutoLISP,可是基本上CAD的主要軟件都支持AutoLISP。Lisp在現在仍是一門很熱門的語言有三個緣由:

  1. 學習Lisp的符號和語法差很少一天就夠了。
  2. Lisp都是函數組合,是一種優雅的結構化編程方式。
  3. 我知道最棒的CS課本: Structure and Interpretation of Computer Programs使用着Lisp

組合式程序(Composing Software)的衰落

在二十世紀七十年代,建立程序的模式於簡單的組合檢票漸遠,成爲了工業流水線式的生產。以後又有了面向對象編程,一個關於組件封裝和信息傳遞的好主意。不過因爲一些熱門的語言扭曲,變成了繼承和類關係的噩夢。

函數是編程在學術和應用上都失去了地位,僅僅殘存在一些有執念的極客,常青藤高塔中的教授,還有一些沒有因Java風潮而着迷的學生那裏。

對於大部分的人來講,這都是一個黑暗的時代。

組合式程序(Composing Software)的再次興起

到了2010年左右,發生了一件好事:JavaScript大爆發。在2006年之前。JavaScript被認爲是一個作網頁動畫的玩具語言,可是其實有不少強大的特性隱匿其中,即λ演算的特性。人們開始口耳相傳的一個「新的概念」:「函數式編程」。

到了2015年,組合式程序的概念又開始興起。爲了讓他更廣泛,JavaScript也升級了新的特性,加入了箭頭函數,使函數,柯里化,以及λ表達式更加直觀可讀。

箭頭函數就像是函數式爆發的火箭燃料,以致現在已經很難見到不怎麼使用函數式編程的JavaScript程序了。

組合讓軟件模型和行爲都更加簡單,優雅,直觀。使用一些輕量而重要函數來構建大一些的程序組件,函數式的編寫程序更加易於測試,理解,組織,引入。

原文:The Rise and Fall and Rise of Functional Programming (Composing Software)

做者:Eric Elliott

翻譯:Dominic Ming

相關文章
相關標籤/搜索