函數式編程的第二春?揭秘其再次崛起的背后原因
托馬斯.庫爾提出“科學的革命”的范式論后,Robert Floyd在1979年圖靈獎的頒獎演說中使用了編程范式一詞。
編程范式,簡單來說,就是編寫命令的方法。
眾所周知,一門語言的思想建立在其編程范式之上。很知名的三種范式分別是面向對象編程、指令式編程和函數式編程。它們并沒有優劣之分,重要的是使用正確的工具來完成工作。
其中,函數式編程是大多數軟件工程師不太熟悉的一個概念。
函數式編程是種編程方式,它將電腦運算視為函數的計算。函數編程語言很重要的基礎是λ演算(lambda calculus),而且λ演算的函數可以接受函數當作輸入(參數)和輸出(返回值)。
和指令式編程相比,函數式編程強調函數的計算比指令的執行重要。
和過程化編程相比,函數式編程里函數的計算可隨時調用。
曾用于編寫計算機程序的第二種編程語言Lisp實際上屬于函數式范式。函數式編程通過簡化編程定義,優先考慮數據的不變性和數學計算,而不是像傳統編程去修改存儲在類構造函數中的對象。在現代函數式編程中,這種想法有點狹隘,但未必是壞事。函數式語言的可變性給函數式編程帶來很多功能,可以說函數式編程非常實用。
考慮到這一點,函數式編程并不局限于函數式語言,如Python具有函數性特征。雖然函數式編程與傳統編程極其不同,但是似乎函數式和面對對象范式與用于數據科學的大多數語言比較接近。
適合我們的工作
大多數函數式語言的標題都有“統計”字樣。這很便利,因為數據科學家很像統計學家,只是多了編程和機器學習技能。函數式語言通常更快,且更易于數據科學家使用。 相信我,你不會想快速瀏覽C代碼,因為這樣準確性有點低。大多數函數式語言完全可讀,且十分容易編寫和掌握。函數式編程是互聯網上最古老的大數據流水線的基礎,一些人對此可能十分驚訝。隨著機器學習和數據計算的發展,函數式編程逐漸流行起來。
很酷的語言
有很多很酷的統計語言,其中很多語言將自有特征與其他傳統特征相互交織,融合在一起。我特別鐘愛以下函數式編程語言。
R語言
R語言是我們的老朋友了。
R語言是一門傳統的函數式語言,但像其它大多數語言一樣,它是(或已經成為)多范式的,即可以從每個特定編程范式中挑選自己喜歡的范式。這給予R語言可變性的優點。R語言起源于S語言且一直專注于統計計算。
Julia
Julia一直是我很喜愛的編程語言。
它雖然是函數式的,但確實包含一些可變的、類似于面對對象的屬性,使得編程更加方便。作為一門高級語言,Julia非常迅速。它很容易進行類型聲明,當聲明合適時可以像C語言一樣迅速,同時比R語言和Scala更具可讀性。
通常,使用Julia的好處之一是它不會占用過長時間來建立模型并進行訓練,因為語言簡單,機器學習(ML)也很迅速。某些情況下,如在我的ML包Lathe中,只需很少的代碼行就能完成機器學習,而且可以通過使用參數動態性更容易地修改構造函數的屬性。
Haskell
Haskell完全不同于以上所提及的多范式語言,它以純粹的函數性聞名。
我從未使用過Haskell,因此不能代表它,但據我所知,Haskell確實是一門很酷的語言。我對Haskell的了解很局限。如上所述,大多數現代語言是多范式的,使得它們可以在不創建新代碼庫的同時有效修復漏洞。
Lisp
雖然Lisp在數據科學領域不一定聞名,但它仍是一門很酷的語言。
Lisp和Julia一樣可使編程十分方便簡單。一個非常值得注意的屬性是Lisp和Julia的宏。宏本身是一個主要的函數式特征,如果使用恰當,可使在notebook中編程更容易。需要注意,Lisp已經將自己分為了一組包括scheme、Clojure和(通用)Lisp在內的語言集。作為第二高級語言,很難探索或估計它及其功能的影響,但影響范圍肯定相當大。
筆者對于Julia的喜愛想必不言而喻了,此前也出過相關文章專門介紹Julia,雖然有時候Python的構造函數(類)可能更適合于特定的工作,但就整體而言,Julia也能完成工作,且對我而言更加流暢高效。
對于另一些人來說,函數式語言可能無法完成他們的目標,對于一直使用面對對象語言的人來說也比較難以學習。
歸根結底,編程語言是一項選擇,大多數編程語言都有開發者,也有其優點和缺點,所以并沒有什么好壞高低之分,就看你個人的編程習慣和喜好啦!