函數語言程式設計從崛起到沒落到再崛起

心靈是一棵開花的樹發表於2017-03-18

 

1

Smoke Art Cubes to Smoke — MattysFlicks — (CC BY 2.0)

請注意:這是JavaScript ES6+學習函數語言程式設計和組合軟體技術的“組合軟體”系列的第1部分。接下來的部分更精彩,敬請期待!

在我大約六歲時,我的大部分光陰是在與我最好的朋友玩電腦遊戲中度過的。他家中有一個裝滿了電腦的房間,對我來說,它們像魔力一樣無法抗拒。我花了很多時間探索所有的遊戲。有一天,我問朋友“我們怎樣能做出一個遊戲呢?”

他不知道,所以我們就去問他的父親,他的父親在一個高架子上拿下來一本關於用Basic寫遊戲的書。我的程式設計之旅從此開始。當公立學校開始講授代數時,我已經很瞭解了,因為程式設計基本上就是代數,代數在程式中無處不在。

 

組合軟體的崛起

在計算機技術發展的初始階段,計算機還不能實現大多數計算前,有兩位偉大的電腦科學家,阿隆佐·邱奇  (Alonzo Church)和阿蘭·圖靈 (Alan Turing)。他們發明了兩種不同的,但是等效的通用計算模型。這兩種模型都可以計算可計算的任何東西(因此被稱為“通用”)。

阿隆佐·邱奇發明了λ演算。λ演算是基於函式組合的通用計算模型。阿蘭·圖靈則以圖靈機而聞名。圖靈機是一種通用計算模型,它定義了一種可以處理條帶上符號的理論裝置。

他們共同證明了λ演算和圖靈機在功能上是等價的。

λ演算是關於函式組合的。函式組合是一種極富有表現力的組合軟體的方法。本文將討論函式組合在軟體設計中的重要性。

 

以下三點使得λ演算與眾不同,

  1. 允許匿名函式:add(x, y) => x + y可以表示為(x, y) => x + y。
  2. λ演算中的函式只接受單個輸入,它是一元的。如果需要多個引數,該函式將接受一個輸入,並返回一個接收下一個引數的新函式,依此類推。N元函式 (x, y) => x + y 可以表示為這樣的一元函式 x => y => x + y。從N元函式到1元函式的這種變換被稱為柯里化(currying)。
  3. 函式是一級的,意味著函式可以作為其他函式的輸入和返回值。

這些特徵共同形成了一個簡單的、表達性的詞彙,用於編寫使用函式作為主要構件塊的軟體。換句話說,使用函式組合來構建軟體。

經典的函式組合是將一個函式的輸出作為另一個函式的輸入,例如,組合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(),f 是 double(), g是inc(), x 是 3.函式呼叫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!’)

2

λ演算對軟體設計有巨大的影響,在1980之前,很多非常有影響力的電腦科學品牌使用函式組合來構建軟體。表處理語言(Lisp)建立於1958,它深受λ演算的影響。現在,Lisp是依然在廣泛使用的歷史第二悠久的語言了。

I was introduced to it through AutoLISP: the scripting language used in the most popular Computer Aided Design (CAD) software: AutoCAD. AutoCAD is so popular, virtually every other CAD application supports AutoLISP so that they can be compatible. Lisp is also a popular teaching language in computer science curriculum for three reasons:

  1. Its simplicity makes it easy to learn the basic syntax and semantics of Lisp in about a day.
  2. Lisp is all about function composition, and function composition is an elegant way to structure applications.
  3. The best computer science text book I know of uses Lisp:Structure and Interpretation of Computer Programs.

我通過AutoLISP瞭解了LISP, AutoLISP是在最流行的計算機輔助軟體(CAD)AutoCAD中使用的指令碼語言。AutoCAD很受歡迎,幾乎每一個其他CAD應用為了能夠與之相容也使用了AutoLISP. Lisp也是電腦科學課程中的一種流行的教學語言,原因有三:

  1. 它的簡單性使得大約一天就可以學會Lisp的基本語法和語義。
  2. Lisp是關於函式組合的,而函式組合是構建應用程式最好的方法。
  3. 我知道最好的電腦科學教科書是使用Lisp的:計算機程式的結構與解釋

 

函數語言程式設計的沒落

1970到1980年間,軟體的構建方法偏離了簡單的組合,成為了供計算機遵循的一系列線性指令。然後出現了物件導向程式設計——一個關於元件封裝和訊息傳遞的偉大想法,卻被流行的程式語言曲解為一個關於繼承層次結構的糟糕想法。

函數語言程式設計被邊緣化,淪落到了學術界:1990到2010年間,酷愛程式設計的極客們,常春藤名校中的教授們,和一些幸運的學生躲過了Java填鴨式的痴迷。

對我們大多數人來說,在這30年中,軟體開發簡直是噩夢。 黑暗時代。

 

函數語言程式設計的崛起

2010年左右,一些偉大的事情開始發生:JavaScript爆發了。在2006年之前,JS被廣泛的認為是用來編寫瀏覽器中小動畫的玩具語言,但它隱藏了一些強大的功能,即λ演算。人們開始悄悄討論這個被稱為“函數語言程式設計”的新事物。

到了2015年,用函式組合來構建軟體的想法再次流行起來。為了使它更簡單,JS規範做了十年來的第一次大版本升級,並新增了箭頭函式,這使得建立和閱讀函式、克里化、λ演算更容易。

箭頭函式就像火箭燃料,使得JS中的函數語言程式設計異常火爆。今天很少見到一個不使用大量函數語言程式設計技術的大型應用程式。

組合是一種簡潔,優雅,清晰的描述軟體行為的方法。組合小的、確定性的功能以建立一個大的軟體元件和功能的流程,產生了易於組織、理解、除錯、擴充套件、測試、維護的軟體。

 

當你閱讀以下文章時,請將例項一一實踐。請記住在學習時,要像孩子一樣,找出問題、探索、邊玩邊學。重新發現兒時發現的樂趣。讓我們來創造一些奇蹟吧。

相關文章