2017 年你應(yīng)該學(xué)習(xí)一下下函數(shù)式編程

簡(jiǎn)評(píng):真的應(yīng)該在 2017 年學(xué)習(xí)一下下函數(shù)式編程,反正我已經(jīng)開(kāi)始學(xué)了,不過(guò)不是原作者墻裂推薦的 Elixir

從 50 年代的 Lisp 開(kāi)始,函數(shù)式編程已經(jīng)存在很長(zhǎng)時(shí)間了,在過(guò)去的兩年里面,如果你持續(xù)關(guān)注的話,像 Clojure、Scala、Erlang 和 Elixir 都有些許新聞,并且都獲得了不小的關(guān)注度。

蛋,究竟什么是函數(shù)式編程,為啥每個(gè)人都為之瘋狂(這是原作者的言論,沒(méi)有先問(wèn)是不是),卻又為啥沒(méi)有太多的人使用,在這篇文章里面,我將嘗試回答這些問(wèn)題。

函數(shù)式編程簡(jiǎn)史

我們上面提到,函數(shù)式編程的歷史是從 50 年代 Lisp 的創(chuàng)建開(kāi)始的,Lisp 采用的很多范式和特征讓我們可以聯(lián)想到現(xiàn)代的函數(shù)式編程,所以我們把 Lisp 叫做函數(shù)式編程的祖父,而所有函數(shù)式編程語(yǔ)言都是基于相同的簡(jiǎn)單的數(shù)學(xué)基礎(chǔ) —— Lambda 演算,這也是函數(shù)式編程中最有趣的一個(gè)方面。

Lambda 演算是圖靈完備的,這也就是說(shuō),它是一種可用于模擬任何單帶圖靈機(jī)的通用的計(jì)算模型,它的同名,希臘字母 λ ,用于 Lambda 表達(dá)式和表示在函數(shù)中綁定變量的 Lambda 項(xiàng)。 —— 譯自維基百科

Lambda 演算是一個(gè)簡(jiǎn)單而強(qiáng)大的概念,其核心有兩個(gè):

  • 函數(shù)抽象:通過(guò)引入變量來(lái)一般化表達(dá)式
  • 函數(shù)應(yīng)用:通過(guò)給特定值給出名稱來(lái)評(píng)估一般表達(dá)式

函數(shù)式編程基礎(chǔ)

足夠的數(shù)學(xué)知識(shí)

函數(shù)式編程特征:函數(shù)

在函數(shù)式編程語(yǔ)言中,函數(shù)是一等公民,這意味著可以把函數(shù)賦值給變量。

函數(shù)式編程特征:高階函數(shù)

高階函數(shù)的定義是將一個(gè)或多個(gè)函數(shù)作為參數(shù)或者返回新函數(shù)的函數(shù)。

函數(shù)式編程特征:不可變狀態(tài)

在函數(shù)式編程語(yǔ)言中,狀態(tài)是不可變的,這意味著變量一旦綁定了值,就不能再綁定其他值了。這將讓語(yǔ)言具有防止副作用和競(jìng)態(tài)條件的優(yōu)點(diǎn),從而使并發(fā)編程更簡(jiǎn)單。

函數(shù)式編程的應(yīng)用

在這個(gè)激動(dòng)人心的時(shí)代,每個(gè)人都可以獲得前所未有的計(jì)算能力,但不幸的是,伴隨而來(lái)的還有可擴(kuò)展性、高性能、并發(fā)性的需求。

面向?qū)ο缶幊滩荒芎?jiǎn)單地解決這個(gè)問(wèn)題,尤其是涉及到并發(fā)和并行。而嘗試給面向?qū)ο笳Z(yǔ)言添加并行和并發(fā)支持,會(huì)會(huì)使這個(gè)語(yǔ)言更加的復(fù)雜,并且往往會(huì)導(dǎo)致過(guò)度的工程量和性能問(wèn)題。另一方面,函數(shù)式編程非常適合這些場(chǎng)景,不可變狀態(tài)、閉包、高階函數(shù)這些概念很適合編寫(xiě)高并發(fā)和分布式應(yīng)用。

當(dāng)然,不要輕信我的一家之言,你可以從 WhatsApp 和 Discord 這樣的創(chuàng)業(yè)公司的技術(shù)資料中找到足夠多的證明:

  • WhatsApp 使用 Erlang 以僅僅 50 人的工程師團(tuán)隊(duì)支撐 9 億用戶
  • Discord 使用 Elixir 每分鐘處理超過(guò)一百萬(wàn)個(gè)請(qǐng)求

由于函數(shù)式編程的優(yōu)勢(shì),這些公司和團(tuán)隊(duì)能夠處理這種巨大的增長(zhǎng),并且獲得越來(lái)越多的牽引力,我堅(jiān)信像 WhatsApp 和 Discord 這樣的故事會(huì)越來(lái)越普遍。因此每一個(gè)軟件開(kāi)發(fā)工程師的 toolbox 都需要函數(shù)式編程,需要為構(gòu)建下一代十億用戶的應(yīng)用做準(zhǔn)備,如果你不相信我說(shuō)的話(函數(shù)式編程很有趣),只需去看看 Elixir:

原文:You Should Learn Functional Programming in 2017
歡迎關(guān)注知乎專欄「極光日?qǐng)?bào)」,每天為 Makers 導(dǎo)讀三篇優(yōu)質(zhì)英文文章。

擴(kuò)展閱讀:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容