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