簡(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ò)展閱讀: