摘要:我稱之為輕量級(jí)函數(shù)式編程。序眾所周知,我是一個(gè)函數(shù)式編程迷。函數(shù)式編程有很多種定義。本書是你開啟函數(shù)式編程旅途的絕佳起點(diǎn)。事實(shí)上,已經(jīng)有很多從頭到尾正確的方式介紹函數(shù)式編程的書了。
原文地址:Functional-Light-JS
原文作者:Kyle Simpson - 《You-Dont-Know-JS》作者
譯者團(tuán)隊(duì)(排名不分先后):阿希、blueken、brucecham、cfanlife、dail、kyoko-df、l3ve、lilins、LittlePineapple、MatildaJin、冬青、pobusama、Cherry、蘿卜、vavd317、vivaxy、萌萌、zhouyao
關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅(jiān)實(shí)的梁柱;分享,是 CSS 里最閃耀的一瞥;總結(jié),是 JavaScript 中最嚴(yán)謹(jǐn)?shù)倪壿嫛=?jīng)過(guò)捶打磨練,成就了本書的中文版。本書包含了函數(shù)式編程之精髓,希望可以幫助大家在學(xué)習(xí)函數(shù)式編程的道路上走的更順暢。比心。
本書主要探索函數(shù)式編程[1](FP)的核心思想。在此過(guò)程中,作者不會(huì)執(zhí)著于使用大量復(fù)雜的概念來(lái)進(jìn)行詮釋,這也是本書的特別之處。我們?cè)?JavaScript 中應(yīng)用的僅僅是一套基本的函數(shù)式編程概念的子集。我稱之為“輕量級(jí)函數(shù)式編程(FLP)”。
注釋: 題目中使用了“輕量”二字,然而這并不是一本“輕松的”“入門級(jí)”書籍。本書是嚴(yán)謹(jǐn)?shù)模涑庵鞣N復(fù)雜的細(xì)節(jié),適合擁有扎實(shí) JS 知識(shí)基礎(chǔ)的閱讀者進(jìn)行研讀。“輕量”意味著范圍縮小。通常來(lái)說(shuō),關(guān)于函數(shù)式編程的 JavaScript 書籍都熱衷于拓展閱讀者的知識(shí)面,并企圖覆蓋更多的知識(shí)點(diǎn)。而本書則對(duì)于每一個(gè)話題都進(jìn)行了深入的探究,盡管這種探究是小范圍進(jìn)行的。
讓我們面對(duì)這個(gè)事實(shí):除非你已經(jīng)是函數(shù)式編程高手中的一員(至少我不是!),否則類似“一個(gè)單子僅僅是自函子中的幺半群”這類說(shuō)法對(duì)我們來(lái)說(shuō)毫無(wú)意義。
這并不是說(shuō),各種復(fù)雜繁瑣的概念是無(wú)意義的,更不是說(shuō),函數(shù)式編程者濫用了它們。一旦你完全掌握了輕量的函數(shù)式編程內(nèi)容,你將會(huì)/但愿會(huì)想要對(duì)函數(shù)式編程的各種概念進(jìn)行更正式更系統(tǒng)的學(xué)習(xí),并且你一定會(huì)對(duì)它們的意義和原因有更深入的理解。
但是我更想要讓你能夠現(xiàn)在就把一些函數(shù)式編程的基礎(chǔ)運(yùn)用到 JavaScript 編程過(guò)程中去,因?yàn)槲蚁嘈胚@會(huì)幫助你寫出更優(yōu)秀的,更符合邏輯的代碼。
更多關(guān)于本書背后的動(dòng)機(jī)和各種觀點(diǎn)討論,請(qǐng)參看[前言]。
JavaScript 輕量級(jí)函數(shù)式編程 目錄序言
前言
第 1 章:為什么使用函數(shù)式編程?
置信度
交流渠道
接受
你不需要它
資源
第 2 章:函數(shù)基礎(chǔ)
什么是函數(shù)?
函數(shù)輸入
函數(shù)輸出
函數(shù)功能
句法
來(lái)說(shuō)說(shuō) This ?
第 3 章:管理函數(shù)的輸入(Inputs)
立即傳參和稍后傳參
一次傳一個(gè)
只要一個(gè)實(shí)參
擴(kuò)展在參數(shù)中的妙用
參數(shù)順序的那些事兒
無(wú)形參風(fēng)格
第 4 章:組合函數(shù)
輸出到輸入
重排序組合
抽象
回顧形參
第 5 章:減少副作用
什么是副作用
一次就好
純粹的快樂(lè)
有或者無(wú)
純化
第 6 章:值的不可變性
原始值的不可變性
從值到值
重新賦值
性能
以不可變的眼光看待數(shù)據(jù)
第 7 章: 閉包 vs 對(duì)象
達(dá)成共識(shí)
相像
同根異枝
第 8 章:列表操作
非函數(shù)式編程列表處理
映射
過(guò)濾器
Reduce
高級(jí)列表操作
方法 vs 獨(dú)立
查尋列表
融合
列表之外
第 9 章:遞歸
定義
聲明式遞歸
棧、堆
重構(gòu)遞歸
第 10 章:異步的函數(shù)式
時(shí)間狀態(tài)
積極的 vs 惰性的
響應(yīng)式函數(shù)式編程
第 11 章:融會(huì)貫通
準(zhǔn)備
股票信息
股票行情界面
附錄 A: Transducing
附錄 B: 謙虛的 Monad
附錄 C: 函數(shù)式編程函數(shù)庫(kù)
關(guān)于出版本書主要在 on Leanpub 平臺(tái)上以電子版本的形式進(jìn)行出版。我也嘗試出售本書的紙質(zhì)版本,但沒(méi)有確定的方案。
除了購(gòu)買本書以外,如果你想要對(duì)本書作一些物質(zhì)上的捐贈(zèng),請(qǐng)?jiān)?patreon 上進(jìn)行操作。本書作者感謝你的慷慨解囊。
Patreon
本書內(nèi)容大多源自于我教授的一個(gè)同名課程(以公司舉辦的公開或內(nèi)部研討會(huì)這樣的形式進(jìn)行)。
如果你喜歡本書的內(nèi)容,并希望組織此類課程,或者組織關(guān)于其他 JS/HTML5/Node.js 課程,請(qǐng)通過(guò)以下方式聯(lián)系我:
http://getify.me
我還提供一些可以在線點(diǎn)播的 JS 培訓(xùn)課程。我在 Frontend Masters 上開辦課程,例如我的 Functional-Lite JS 研討會(huì)。還有一些課程發(fā)布在 PluralSight 上。
Contributions 關(guān)于內(nèi)容貢獻(xiàn)非常歡迎對(duì)于本書的任何內(nèi)容貢獻(xiàn)。但是在提交 PR 之前請(qǐng)務(wù)必認(rèn)真閱讀 Contributions Guidelines。
License & Copyright 版權(quán)本書所有的材料和內(nèi)容都?xì)w屬 (c) 2016-2017 Kyle Simpson 所有。
本書根據(jù)Creative Commons Attribution-NonCommercial-NoDerivs 4.0 Unported License 進(jìn)行授權(quán)許可.
FP,本書統(tǒng)稱為函數(shù)式編程。
序眾所周知,我是一個(gè)函數(shù)式編程迷。我嘗試閱讀最新的學(xué)術(shù)論文,業(yè)余時(shí)間乃至工作間隙研究抽象代數(shù)(譯者注:抽象代數(shù)又稱近世代數(shù),是研究各種抽象公理化代數(shù)系統(tǒng)的數(shù)學(xué)學(xué)科,也是現(xiàn)代計(jì)算機(jī)理論基礎(chǔ)之一),并四處傳播函數(shù)式編程的理念和語(yǔ)言。我所書寫的 JavaScript 代碼,每一條語(yǔ)句都是純的。沒(méi)錯(cuò),我就是一個(gè)徹頭徹尾的函數(shù)式編程教條式的狂熱者。關(guān)于為什么要寫純的語(yǔ)句,請(qǐng)看我寫的這本書。
其實(shí)我以前并不是這樣子... 我曾癡迷于面向?qū)ο螅嶂杂谑褂妹嫦驅(qū)ο蟮姆椒▉?lái)構(gòu)建“真實(shí)世界”。我是人造機(jī)器人的發(fā)明者,夜以繼日地修正機(jī)器人以達(dá)到更高精度的控制力。我也是有意識(shí)木偶的創(chuàng)造者,手指在鍵盤上的輕舞飛揚(yáng)賦予了它們生命。做為黑客界的蓋比特(譯者注:蓋比特是玩具之父),在連續(xù)不間斷的寫了 5 年面向?qū)ο蟮拇a后,我對(duì)于這些成果還是不甚滿意。整個(gè)過(guò)程也并不順利,我一直感覺(jué)自己是一個(gè)糟糕的程序員,甚至失去了信心,認(rèn)為寫出既簡(jiǎn)單,又靈活同時(shí)又很好擴(kuò)展的代碼是不可能的。
我想是時(shí)候去嘗試一些新的方法了,我開始涉足函數(shù)式編程的理念,并把它用在我的代碼中。我的同事對(duì)此非常驚詫,他們根本不知道我在干什么。那段時(shí)間里我寫的代碼非常糟糕、另人生厭、簡(jiǎn)直是垃圾。造成這樣結(jié)果的原因是我缺少一個(gè)目標(biāo)或者說(shuō)愿景。當(dāng)然現(xiàn)在那個(gè)會(huì)編碼的蟋蟀杰明尼(譯者注:原文使用 Jiminy-Coding-Cricket 迪士尼動(dòng)畫人物蟋蟀杰明尼來(lái)暗指之前蹩腳的自己)已經(jīng)不在了。在花費(fèi)了好長(zhǎng)時(shí)間,寫了好多垃圾程序后我才弄明白怎樣正確進(jìn)行函數(shù)式編程。
現(xiàn)在,經(jīng)歷了那些亂七八糟的探索后,我感覺(jué)到純函數(shù)編程實(shí)現(xiàn)了它所承諾的代碼可讀性和可復(fù)用。我不再發(fā)明而是發(fā)現(xiàn)我的模型,我像一個(gè)正在揭開巨大陰謀的偵探,在軟木板上釘滿了數(shù)學(xué)證據(jù)。一個(gè)數(shù)字時(shí)代的庫(kù)斯托(譯者注:庫(kù)斯托是個(gè)傳奇式的人物,探險(xiǎn)家、電影制片人,一個(gè)享有戴高樂(lè)將軍一樣世界性聲譽(yù)的法國(guó)人,作者比喻自己學(xué)習(xí)函數(shù)式編程就像庫(kù)斯托探索海洋一般)以科學(xué)的名義記錄下了這片奇特土地的特征!雖然并不完美,仍有很多東西要學(xué)習(xí),但我對(duì)我的工作和產(chǎn)出從未有過(guò)現(xiàn)在這般滿意!
假如一開始就有這本書,我探索純函數(shù)式編程世界的道路就會(huì)更平坦一點(diǎn),而不是荊棘滿地。本書有兩層:第一層教會(huì)你如何在每天的編碼工作中,有效地使用各種各樣的函數(shù)式構(gòu)造方法。另一層則更重要,本書會(huì)提供一個(gè)準(zhǔn)星,確保你不會(huì)偏離函數(shù)式編程的原則。
函數(shù)式編程是一種編程范式,Kyle 倡導(dǎo)使用它來(lái)實(shí)現(xiàn)聲明式編程和函數(shù)式編程,同時(shí)該范式還可以與 JavaScript 世界形成平衡和互動(dòng)。通過(guò)學(xué)習(xí)本書,你無(wú)需徹底理解范式的一切,就能了解純函數(shù)式編程的基礎(chǔ);你無(wú)需重新創(chuàng)造輪子,就能獲得練習(xí)和探索函數(shù)式編程的技能,并讓代碼運(yùn)行良好;你無(wú)需像我之前一樣漫無(wú)目的地徘徊、甚至走回頭路就能讓你的職業(yè)生涯更上一層樓。你的合作者和同事們一定會(huì)欣喜若狂!
Kyle (譯者注:Kyle 是火爆全球的《你不知道的 JavaScript》一書原作者)是一位偉大的老師,他對(duì)函數(shù)式編程的宏偉藍(lán)圖不懈追求,不放過(guò)任何一個(gè)角落和縫隙,同時(shí)他也苦學(xué)習(xí)者之苦。他的風(fēng)格與行業(yè)產(chǎn)生共鳴,將大家的水平整體提高了一個(gè)檔次。他的工作成果不僅出現(xiàn)在很多人的收藏夾中,也在 JavaScript 發(fā)展歷史上占據(jù)堅(jiān)實(shí)地位。Kyle 老師是絕世高手,你值得擁有。
函數(shù)式編程有很多種定義。Lisp 程序員和 Haskell 程序員對(duì)于函數(shù)式編程的定義截然不同。OCaml 和 Erlang 語(yǔ)言對(duì)于函數(shù)式編程范式的看法也大相徑庭。即使在同一種語(yǔ)言 JavaScript 中,你也能看到函數(shù)式編程不同的定義。但總有一種紐帶把這些不同的函數(shù)式編程連接在一起,這個(gè)紐帶是一個(gè)有些模糊的“我一看就知道”的定義,這聽起來(lái)有點(diǎn)下流(有人確實(shí)覺(jué)得函數(shù)式編程下流)。本書旨在抓住這個(gè)紐帶,并不讓你學(xué)習(xí)某些圈子的固定習(xí)語(yǔ),而是讓你獲取相關(guān)知識(shí),這些知識(shí)不論在哪個(gè)語(yǔ)言的函數(shù)式編程中都適用。
本書是你開啟函數(shù)式編程旅途的絕佳起點(diǎn)。開始吧,Kyle 老師...
-Brian Lonsdorf (@drboolean)
前言單子是自函子范疇上的一個(gè)幺半群
有暈頭轉(zhuǎn)向嗎?不要擔(dān)心,我自己也被繞暈了!對(duì)于那些已經(jīng)了解函數(shù)式編程的人來(lái)說(shuō),這些專業(yè)術(shù)語(yǔ)才有意義,然而對(duì)于大部分人而言,它們沒(méi)有任何意義。
這本書并不打算教你以上那些專業(yè)術(shù)語(yǔ)的具體含義。如果那正是你想查找的,請(qǐng)繼續(xù)查閱。事實(shí)上,已經(jīng)有很多從頭到尾(正確的方式)介紹函數(shù)式編程的書了。如果你在深入學(xué)習(xí)函數(shù)式編程,這些專業(yè)術(shù)語(yǔ)有很重要的意義,你肯定會(huì)對(duì)這些專業(yè)術(shù)語(yǔ)越來(lái)越熟悉。
但是本書打算以另一種方式講解函數(shù)式編程。我將從函數(shù)式編程的一些基礎(chǔ)概念講起,并盡可能少用晦澀難懂的專業(yè)術(shù)語(yǔ)。我們將嘗試以更實(shí)用的方法來(lái)探討函數(shù)式編程,而非純粹的學(xué)術(shù)角度。毫無(wú)疑問(wèn),肯定會(huì)有專業(yè)術(shù)語(yǔ)。但是我將會(huì)小心謹(jǐn)慎的引入這些術(shù)語(yǔ)并解釋為何它們?nèi)绱酥匾?/p>
可悲的是我并非酷酷的函數(shù)式編程俱樂(lè)部的一員。我從沒(méi)有正式學(xué)過(guò)函數(shù)式編程。盡管我有計(jì)算機(jī)方面的教育背景并對(duì)數(shù)學(xué)有一定了解,但數(shù)學(xué)符號(hào)跟我理解的編程完全是兩回事。我從來(lái)沒(méi)寫過(guò)一行 Scheme、Clojure 或 Haskell 代碼,也不是老派的 Lisp 程序員。
我曾參加過(guò)不計(jì)其數(shù)的討論函數(shù)式編程的會(huì)議,每次都希望能徹底搞明白函數(shù)式編程中那些神秘的概念到底是什么意思。然而每次我都失望而歸,那些概念在我腦海里亂成一團(tuán),我甚至不清楚自己學(xué)了些什么。也許我學(xué)到了些東西吧,但是很長(zhǎng)時(shí)間以來(lái)我都不能確定自己學(xué)到了什么。
通過(guò)不斷的編程實(shí)踐,而非站在學(xué)術(shù)的角度,我慢慢的理解了那些對(duì)函數(shù)式編程者[1]
來(lái)說(shuō)很簡(jiǎn)單直白的重要概念。你是否也有類似的經(jīng)歷 —— 你早就知道一件事,但直到很久之后你突然發(fā)現(xiàn)它竟然還有一個(gè)你從來(lái)不知道的名字!?
也許你像我一樣;好幾年前就聽說(shuō)過(guò)像“map-reduce”,“big data”等這些術(shù)語(yǔ),但并不懂它們的實(shí)際意義。最終我明白了map(..)函數(shù)到底做了哪些事情 —— 在我知道列表操作是通向函數(shù)式編程者之路的基石,并且為何它們?nèi)绱酥匾蟆N抑?em>映射很久了,甚至在我知道它叫map(..)之前。
最終我開始整理這些想法并將它們稱之為「輕量級(jí)函數(shù)式編程」(FLP)。
使命但是,為什么學(xué)習(xí)函數(shù)式編程如此重要,即便只是學(xué)習(xí)輕量級(jí)函數(shù)式編程?
最近幾年我越來(lái)越深刻的理解到編程的核心是人,而不是代碼,我甚至將其視為一種信仰。我堅(jiān)信代碼只是人類交流的手段,只是它產(chǎn)生的副作用(仿佛聽到了自我引用的笑聲)才對(duì)電腦發(fā)出具體指令。
在我看來(lái),函數(shù)式編程的核心在于讓你在編程時(shí)使用一些廣為人知、易于理解的模式。經(jīng)過(guò)驗(yàn)證,這些模式可以有效隔離讓代碼難以理解的錯(cuò)誤。所以,函數(shù)式編程 —— 咳,輕量級(jí)函數(shù)式編程 —— 是每個(gè)開發(fā)者都可以掌握的重要工具之一。
monad的含義是,一旦你搞懂了,你就無(wú)法跟別人解釋什么是monad了。
Douglas Crockford 2012 "Monads and Gonads"
https://www.youtube.com/watch...
我希望這本書有可能打破上面的詛咒,盡管我們要到最后的附錄部分才開始討論「monad」。
科班出身的函數(shù)式編程者經(jīng)常宣稱只有 100% 使用函數(shù)式編程才算是真正地使用函數(shù)式編程:這是一種要么全有要么全無(wú)的主張。它會(huì)讓人覺(jué)得如果編程時(shí)只有一部分使用了函數(shù)式編程而另一部分沒(méi)用到,整個(gè)程序會(huì)被那些沒(méi)有使用函數(shù)式編程的部分污染,從而認(rèn)為使用函數(shù)式編程并不值得。
我想明確地說(shuō):我認(rèn)為絕對(duì)主義并不存在。這沒(méi)有意義,就像愚蠢地建議我只有使用完美的語(yǔ)法,這本書才算完美,如果犯了一點(diǎn)點(diǎn)錯(cuò)誤,就會(huì)讓整本書質(zhì)量變低一樣。
我寫地越清楚,前后越一致,你閱讀此書的體驗(yàn)將越好。但我不是一個(gè)完美無(wú)缺的作者。有些章節(jié)可能比另外一些寫的好。但是那些有待提高的章節(jié)不會(huì)使書中寫的好的部分黯然失色。
同樣的道理也適用于代碼。隨著你越來(lái)越多的使用函數(shù)式編程的模式,你的代碼質(zhì)量會(huì)越來(lái)越高。25% 的時(shí)間使用它們,你會(huì)得到一些好處。80% 的時(shí)間使用它們,你將收益更多。
除了幾處僅存的特例,你不會(huì)在本書里看到很多絕對(duì)的論斷。我們討論的是要追求的目標(biāo)和現(xiàn)實(shí)中方方面面的權(quán)衡。
歡迎來(lái)到最實(shí)用的函數(shù)式編程的學(xué)習(xí)之旅。我們將共同探討學(xué)習(xí)!
FPer,本書統(tǒng)稱為函數(shù)式編程者。
【下一章】翻譯連載 |《JavaScript 輕量級(jí)函數(shù)式編程》- 第 1 章:為什么使用函數(shù)式編程?
iKcamp原創(chuàng)新書《移動(dòng)Web前端高效開發(fā)實(shí)戰(zhàn)》已在亞馬遜、京東、當(dāng)當(dāng)開售。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/85005.html
摘要:所以我覺(jué)得函數(shù)式編程領(lǐng)域更像學(xué)者的領(lǐng)域。函數(shù)式編程的原則是完善的,經(jīng)過(guò)了深入的研究和審查,并且可以被驗(yàn)證。函數(shù)式編程是編寫可讀代碼的最有效工具之一可能還有其他。我知道很多函數(shù)式編程編程者會(huì)認(rèn)為形式主義本身有助于學(xué)習(xí)。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson - 《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液...
摘要:本書主要探索函數(shù)式編程的核心思想。我們?cè)谥袘?yīng)用的僅僅是一套基本的函數(shù)式編程概念的子集。我稱之為輕量級(jí)函數(shù)式編程。通常來(lái)說(shuō),關(guān)于函數(shù)式編程的書籍都熱衷于拓展閱讀者的知識(shí)面,并企圖覆蓋更多的知識(shí)點(diǎn)。,本書統(tǒng)稱為函數(shù)式編程者。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson - 《You-Dont-Know-JS》作者 譯者團(tuán)隊(duì)(排名不分先后)...
摘要:就像我寫書的過(guò)程一樣,每個(gè)開發(fā)者在學(xué)習(xí)函數(shù)式編程的旅程中都會(huì)經(jīng)歷這個(gè)部分。類型在函數(shù)式編程中有一個(gè)巨大的興趣領(lǐng)域類型論,本書基本上完全遠(yuǎn)離了該領(lǐng)域。在函數(shù)式編程中,像這樣涵蓋是很普遍的。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML...
摘要:為了盡可能提升互通性,已經(jīng)成為函數(shù)式編程庫(kù)遵循的實(shí)際標(biāo)準(zhǔn)。與輕量級(jí)函數(shù)式編程的概念相反,它以火力全開的姿態(tài)進(jìn)軍的函數(shù)式編程世界。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅(jiān)實(shí)的梁柱;分享,是 CSS 里最閃耀的一瞥;總結(jié),...
摘要:一旦我們滿足了基本條件值為,我們將不再調(diào)用遞歸函數(shù),只是有效地執(zhí)行了。遞歸深諳函數(shù)式編程之精髓,最被廣泛引證的原因是,在調(diào)用棧中,遞歸把大部分顯式狀態(tài)跟蹤換為了隱式狀態(tài)。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅(jiān)實(shí)的梁柱;...
閱讀 2415·2021-11-25 09:43
閱讀 1249·2021-11-24 09:39
閱讀 750·2021-11-23 09:51
閱讀 2388·2021-09-07 10:18
閱讀 1856·2021-09-01 11:39
閱讀 2779·2019-08-30 15:52
閱讀 2595·2019-08-30 14:21
閱讀 2860·2019-08-29 16:57