趣味函數(shù)式編程圣經(jīng)
1
第一天
上帝看到約翰·麥卡錫發(fā)明了表處理語言 Lisp,卻只用來學(xué)術(shù)研究,很是傷心,就把 Lisp 解釋器的秘密告訴了他的學(xué)生斯蒂芬·羅素,斯蒂芬·羅素將eval函數(shù)在IBM 704機(jī)器上實(shí)現(xiàn)后,函數(shù)式編程的大門第一次向人類打開了。
2
第二天
這個(gè)平行宇宙的上帝思想獨(dú)特,他說:“ 要有不變量”

上帝又說: “函數(shù)應(yīng)該是純粹的(純函數(shù))”
不能修改傳遞給函數(shù)的變量!
不能修改全局變量!
對于同樣的輸入?yún)?shù),返回值總是相同的!
下面的函數(shù)是被允許的,每次調(diào)用,返回值都相同,可以安全地調(diào)用,直到宇宙毀滅。

這樣的函數(shù)在函數(shù)式宇宙中是不允許的,因?yàn)榈诙握{(diào)用就會(huì)導(dǎo)致函數(shù)式宇宙的毀滅。

這個(gè)函數(shù)是不被允許的,它竟然想修改輸入?yún)?shù)!

如果函數(shù)返回了一個(gè)新的數(shù)組,而沒有改變原有的值,那函數(shù)式上帝很高興。

人類對于上帝立下的規(guī)矩表示迷惑不解: are you kiding me ?
3
第三天
人類嘗試著寫程序,由于不變量的規(guī)定,發(fā)現(xiàn)連個(gè)最基本的for 循環(huán)都搞不定。

人類迷惑不解:“有沒有搞錯(cuò), 我們怎么寫循環(huán)?”
上帝說:“你們用循環(huán)干什么?”
人類寫了一段代碼。

上帝說:要有遞歸!
上帝也寫了一段代碼:

人類說:“這雖然能完成工作,但是好像不太直觀??!再說,親愛的上帝,如果我那個(gè)list容量很大,遞歸層次很深,會(huì)不會(huì)出現(xiàn)棧溢出?”
上帝說:“沒事,我有尾遞歸,保證不溢出。這種遞歸的寫法,你們慢慢就習(xí)慣了?!?/p>
4
第四天
上帝發(fā)現(xiàn)很多函數(shù)大體上都是相同的,只有部分細(xì)節(jié)不一樣,有很多重復(fù)代碼,太浪費(fèi)了。

上帝說:“要有高階函數(shù)!”
讓函數(shù)來生成函數(shù),把公用的部分抽取出來,不共用的部分與共用部分能組合起來。

上帝提供了幾個(gè)很好用的高階函數(shù),如map,filter, fold等,讓人類快速高效地去操作集合數(shù)據(jù)。

5
第五天
上帝對自己的工作很滿意。仿佛程序世界的框架已經(jīng)基本完成,只剩下邊邊角角的實(shí)現(xiàn)了。
可是這個(gè)宇宙的人類總是抱怨函數(shù)式編程太難,看到這里的上帝不愿意改變,有很多人都穿越到編號(hào)為S-87那個(gè)所謂“面向?qū)ο蟆钡挠钪嫒チ恕?/p>
上帝嘆了口氣:“你們吶,目光短淺,摩爾定律已經(jīng)失效,多核時(shí)代已經(jīng)來臨,我們函數(shù)式編程天生是為并發(fā)編程而生的啊,你看看函數(shù)沒有side effect,不共享變量,可以安全地調(diào)度到任何一個(gè)CPU core上去運(yùn)行,沒有煩人的加鎖問題,多好??!”
過了兩天,隔壁 S-87 宇宙的面向?qū)ο笊系蹃泶T了。
面向?qū)ο笊系壅f:“親愛的函數(shù)式上帝,聽叛逃者,不,投誠者,啊,是穿越到我那里的人說,你這個(gè)宇宙有個(gè)叫做函數(shù)式編程的寶貝?”
函數(shù)式上帝:“還寶貝?!人都跑光了!”
“你給我講講吧,到時(shí)候我再勸他們回來?!?/p>
函數(shù)式上帝于是給他講了自己創(chuàng)世紀(jì)時(shí)立下的規(guī)矩,還講了很多他打算在第6天,第7天告訴人類的知識(shí),什么Currying, 惰性求值,宏(macro)等等。
面向?qū)ο笊系郾硎靖兄x,喜滋滋地回去了。
后來,函數(shù)式上帝聽說面向?qū)ο蟮挠钪娉霈F(xiàn)了不少混合式風(fēng)格編程的語言 OOP + FP (Functional Programming),也就沒多少人再回到自己的宇宙了。
函數(shù)式上帝什么都沒說,嘆了口氣。
6
第六天
函數(shù)式上帝決定休息。
7
第七天
函數(shù)式上帝繼續(xù)休息。
這就是為什么函數(shù)式世界的程序員能休息兩天的來歷。
以上就是趣味函數(shù)式編程圣經(jīng) 的詳細(xì)內(nèi)容,更多關(guān)于函數(shù)式編程的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
ffmpeg播放器實(shí)現(xiàn)詳解之視頻顯示(推薦)
FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計(jì)算機(jī)程序。這篇文章主要介紹了ffmpeg播放器實(shí)現(xiàn)詳解視頻顯示,需要的朋友可以參考下2020-07-07
Eclipse 誤刪文件的恢復(fù)與代碼的恢復(fù)詳解
這篇文章主要介紹了Eclipse 誤刪文件的恢復(fù),代碼的恢復(fù)的相關(guān)資料,需要的朋友可以參考下2016-09-09
Scala函數(shù)式編程專題--scala集合和函數(shù)
這篇文章主要介紹了scala集合和函數(shù)的的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06
vant/vue實(shí)現(xiàn)小程序下拉刷新功能方法詳解
這篇文章主要介紹了vant/vue實(shí)現(xiàn)小程序下拉刷新功能方法詳解,需要的朋友可以參考下2022-12-12
淺談架構(gòu)模式變遷之從分層架構(gòu)到微服務(wù)架構(gòu)
一般地,架構(gòu)模式大致可以分成兩類,單體架構(gòu)(monolithic architecture)和分布式架構(gòu)(distributed architecture)。2021-05-05

