前端函數式攻城指南 ( 簡體 字) |
作者:歐陽繼超 | 類別:1. -> 程式設計 -> 網路編程 -> Javascript |
譯者: |
出版社:電子工業出版社 | 3dWoo書號: 45195 詢問書籍請說出此書號!【有庫存】 NT售價: 295 元 |
出版日:9/1/2016 |
頁數:192 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787121297243 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:序
函數式編程可以說是非常古老的編程方式,但是近年來函數式編程越來越受到人們的關注。不管是Google力推的Go、學術派的Scala與Haskell,還是Lisp的新方言Clojure,這些新的函數式編程語言都越來越受到人們的關注。 當然不僅是后端函數式編程語言層出不窮,前端也不甘示弱。雖然前端瀏覽器只支持一門語言——JavaScript,但是能支持函數式編程的JavaScript庫越來越多,比如Functional JavaScript 、Underscore、lodash等。不僅如此,還有一些能編譯成JavaScript的語言,能讓前端的函數式編程發揮到極致,例如Haskell的PureScript、Scala的Scalajs、Clojure的ClojureScript。 我兩次都以Clojure結尾,是因為我喜歡把重點留到最后。Clojure獨特于其他語言,它既是一門新的語言、一門函數式編程范式的語言,又流淌著古老的血液——Lisp 。這是我選擇用Clojure來詮釋函數式編程的原因之一。 那么為什么我要選JavaScript作為函數式編程的目標呢?Michael Fogus用200多頁向大家展示了不一樣的Functional JavaScript編程方式,可惜Fogus作為ClojureScript編譯器的貢獻者,竟然選擇了Underscore作為函數式庫,直接導致并不能完全展示JavaScript所能達到的函數式編程能力。有趣的是,ClojureScript的作者把ClojureScript的不可變(Immutable)數據結構移植到了JavaScript,這徹底將 JavaScript 的函數式編程提升到了用其他庫都完成不了的新高度 。不僅如此,Mozilla的Sweet.js(https://github.com/mozilla/sweet.js)更是完成了另一個突破——JavaScript的macro,它雖然不能算是函數式的概念,但也算是Lisp語言的一項獨門絕技了 。 這一切的一切,都讓我忍不住要幫Fogus出一本續集,用JavaScript實現其他函數式編程語言如Clojure甚至是Haskell 的奇技淫巧,讓大家進一步感受用JavaScript這門不完美的語言同樣可以編寫出優雅的函數式代碼,以不一樣的方式思考和解決問題。于是不管你是想轉行JavaScript的Clojure開發者,還是想了解Clojure或函數式編程的JavaScript開發者,都可以在此找到一些啟發。但這并不是一本JavaScript入門的好書 。
前言
1.看本書之前你要知道 1)最好能看懂JavaScript代碼 這既不是一本介紹Clojure的書,也不是一本介紹JavaScript的書,而是一本介紹如何用JavaScript函數式編程的書。其中一些函數式的思想和表現形式都借用了Clojure,因此叫作Clojure 風格的函數式JavaScript,但是并不要求在讀本書前會Clojure ,而只需要能閱讀JavaScript代碼。如果你會Clojure,則可以完全忽略我解釋Clojure代碼的段落,當然JavaScript的部分才是重點。 2)你可能買錯書了,如果你 ? 想學JavaScript 這不是一本JavaScript的教科書,這里只會介紹如何用JavaScript進行函數式編程,所以如果想要系統地學習JavaScript,則學習《JavaScript語言精粹》可能已經足夠了。另外,如果讀者的英文水平好的話,則還有一本可以在線免費閱讀的JavaScript Allonge。 ? 想學Clojure 同樣,這也不是一本Clojure的教科書,只含有一些用于闡述函數式編程思想的Clojure代碼。你確實可以學到一些Clojure編程知識,但很可能是非常零碎且不完整的知識。如果想要系統地了解和學習Clojure,則非常推薦你閱讀The Joy of Clojure ,另外,如果讀者英文比較好,還有一本可以免費在線閱讀的CLOJURE for the BRAVE and TRUE也非常不錯。 ? 是函數式編程的專家 如果你已經在日常工作或學習中使用Scala、Clojure或者Haskell等函數式語言編程的話,那么本書對你在函數式編程上的幫助不會太大。不過:這本書對緩解你從函數式語言遷移到JavaScript編程的不適應該是非常有效的。這也正是本書的目的之一。 2.準備環境 在開始閱讀本書之前,如果你希望能運行書中的代碼,可能需要一些環境的配置。而且書中的所有源碼和運行方式都可以在本書的Github倉庫 中找到。當然如果你使用Emacs(同時還配置了org babel的話)閱讀本書的源碼,對于大部分代碼只需要光標放在代碼處按c-c c-c即可。 ? JavaScript 原生的JavaScript沒有什么好準備的,可以通過Node或者Firefox(推薦)的Console運行代碼。當然第5章會有一些使用Sweet.js寫的Macro,這則需要安裝Sweet.js。 – 安裝Node/io.js (1)下載Node.js。 (2)如果使用Mac,可以直接用Brew安裝。 brew install node # 或者 brew install iojs – 安裝Sweet.js 在安裝完Node.js之后在命令行輸入: npm install -g sweet.js ? Clojure 書中的Clojure代碼大都用來描述函數式編程的概念,當然如果想要運行書中的 Clojure 代碼,首先需要安裝JVM或者JDK ,至少需要1.6版本,推薦安裝1.8版本。 – 安裝 leiningen leiningen是Clojure的包管理工具,類似于Node的Npm、Ruby的bundle、Python的pip。另外leiningen還提供腳手架的功能。可以通過官網的腳本安裝 。Mac用戶可以簡單地使用brew install leiningen安裝。 安裝完成之后,就可以運行lein repl,打開repl,試試輸入下列Clojure代碼,你將會立馬看見結果。 (+ 1 1) ;=> 2 – 編輯器 如果更喜歡使用編輯器來編輯更長的一段代碼,我推薦非Emacs用戶使用Light Table ,Intellij用戶則使用cursive 。當然如果讀者已經在使用Emacs,那就更完美了,Emacs cider mode 是Clojure編程不錯的選擇。 3.本書中的代碼 書中的所有源碼和運行方式都可以在本書的Github倉庫 中找到,書中幾乎所有的例子都以測試的形式完成。 4.反饋 如果你是開源貢獻者,那么應該很習慣通過Github Issue9提交任何反饋,如果是Pull Request,那就更好了。當然如果沒有使用過Github Issue也沒有關系,這里 有非常詳細的教程。 5.代碼風格約定 本書的JavaScript代碼都遵循Airbnb JavaScript Style Guide 中的ES5和React的風格約定。 6.本書的組織結構 第1章 將介紹JavaScript的基本函數式背景,簡要地介紹為什么要關心函數式編程,為什么說Underscore不夠函數式,JavaScript要作為完整的函數式語言還缺些什么? 第2章 主要介紹Clojure的集合數據結構。這是個無聊但是又很重要的章節,可以說函數式編程最基本、最重要的就是集合操作。本章會涉及如何操作集合、惰性求值與惰性序列。 第3章 在了解了持久性數據結構后,我們可能會產生疑惑,如果數據結構都是不可變的,那么循環該怎么寫呢?本章就是要解開各種使用不可變數據結構的疑惑,用這些不可變數據結構可以切換一種編程的思維方式。 第4章 Underscore并不利于函數組合,但是函數組合其實是函數式編程最重要的思想。在這一章里面,我會詳細介紹為什么說Underscore錯了,而為什么要喜歡上柯里化,以及Clojure 1.7新推出的Transducer又是如何幫助我們更容易組合出更高效的函數的。 第5章 我特別不情愿把Macro翻譯成宏。宏特別容易讓人以為是 C 語言里面那個#define宏,雖然都是宏,但其實那里跟這里說的Macro不是一個級別的。Macro是Lisp語言之所以特別的原因之一。本章我們就來看看到底什么是、為什么,以及如何在JavaScript中使用Macro。 第6章 這里說的模式匹配包括兩種:一種是按位置或者key匹配集合,取出相應數據。另一種是Haskell風格的對函數參數的模式匹配。本章篇幅比較小,因為模式匹配并不是Clojure(也不是JavaScript)的主要模式,盡管在一些有強大類型系統的函數式語言(Scala、Haskell)中比較重要。 第7章 Monad這個范疇論里出來的神秘玩意,但你可能沒有在意,其實這在前端世界早都被玩膩了。本章將會介紹Monad和它的朋友們,并且將帶你體驗JavaScript的Promise,以及Reactive編程。 第8章 并發編程一直是令人頭疼的編程方式,直到Clojure和Go的出現,徹底改變了我們并發編程的方式。而對于單線程的JavaScript,基于事件循環的并發模型也一直困擾著我們,到底能從Clojure學些什么,可以使我們的前端并發編程之路更順暢一些呢?本章將帶你熟悉并發、JavaScript的并發模型,以及CSP并發模型。 7.本書使用的約定 本書使用以下字體排版約定。 1)楷體 表示新的術語。 2)等寬字體 代碼清單,出現在段落之內則表示變量、函數名、關鍵字等。 3)粗體 重點概念。 4)下畫線 需要填入的詞,我可能已經幫大家填上了。 5)橫線 可以忽略的詞。 |
內容簡介:在后端,函數式語言層出不窮。在前端,函數式最后的邊界也已經被漸漸打破。Scala的Scala.js、Clojure的ClojureScript都試圖同構移向前端。然而,原生JavaScript其實也可以通過豐富的庫讓前端的函數式編程一樣的舒適和優雅。本書涵蓋了大部分函數式編程思想,包括JavaScript的函數式支持,Clojure風格的集合、遞歸、函數組合、宏、模式匹配、實用的Monads,以及前端的并發編程。本書適合想要了解函數式編程的JavaScript程序員或者想學習JavaScript的函數式程序員閱讀。 |
目錄:第1章 函數式JavaScript 1 1.1 JavaScript也是函數式語言嗎 1 1.1.1 編程范式 1 1.1.2 JavaScript的函數式支持 3 1.2 作為函數式語言,JavaScript還差些什么 10 1.2.1 不可變數據結構 11 1.2.2 惰性求值 11 1.2.3 函數組合 12 1.2.4 尾遞歸優化 13 1.3 Underscore你錯了 14 1.3.1 跟大家都不一樣的 map 函數 14 1.3.2 ClojureScript 16 1.3.3 Mori 17 1.4 小結 18 第2章 集合 19 2.1 集合的使用 20 2.1.1 向量(vector) 20 2.1.2 Map 23 2.1.3 函數組合子 24 2.2 持久性數據結構 27 2.2.1 向量的持久性數據結構 28 2.2.2 最后一片葉子不完整 31 2.2.3 所有葉子完整且葉子個數不大于完全樹的葉子個數 32 2.2.4 所有葉子完整且葉子個數大于完全樹的葉子個數 34 2.3 不可變性 35 2.3.1 致命魔術 36 2.3.2 引用透明性 38 2.3.3 函數式React 40 2.3.4 線程不安全 42 2.4 惰性序列 44 2.4.1 改良奧利奧吃法 44 2.4.2 惰性求值與及早求值 46 2.4.3 惰性求值的實現 48 2.5 小結 50 第3章 遞歸 51 3.1 不可變性與遞歸 51 3.1.1 真的需要循環嗎 52 3.1.2 遞歸還是循環 54 3.2 柯里悖論 55 3.2.1 Y組合子 57 3.2.2 棧是多么容易爆 60 3.3 尾遞歸優化 62 3.4 蹦跳樂園(Trampoline) 64 3.4.1 有窮狀態機(DFA) 65 3.4.2 Trampoline 67 3.5 小結 69 第4章 函數組合 70 4.1 Underscore到底做錯了什么 70 4.1.1 自由(Free)變量與約束(Bound)變量 72 4.1.2 閉包 74 4.2 柯里化有什么用 75 4.3 Transducer 78 4.3.1 Reducer 79 4.3.2 來看看更好更快的解法 79 4.3.3 Reducer 80 4.3.4 Reducible 81 4.3.5 Transducer詳解 82 4.3.6 跟柯里化有什么區別 83 4.4 組合與管道 84 4.4.1 管道(Pipeline) 84 4.4.2 組合與管道 86 4.4.3 管道函數 87 4.5 小結 87 第5章 Macro宏 89 5.1 什么是REPL 89 5.1.1 宏擴展器(Macro Expander) 90 5.1.2 那么前端怎么辦 92 5.2 為什么要語法糖 93 5.2.1 只是為了語法漂亮嗎 94 5.3 Sweet.js 94 5.3.1 Rule Macro 95 5.3.2 Case Macro 97 5.4 Infix Macro 和 Operator 104 5.4.1 Infix Macro 104 5.4.2 自定義操作符 105 5.5 小結 106 第6章 模式匹配 107 6.1 Destructure 107 6.1.1 對象 109 6.1.2 數組 109 6.1.3 函數 109 6.2 Arity 函數 110 6.3 Fizz Buzz 111 6.3.1 字面匹配(Literal Matching) 111 6.3.2 綁定 113 6.3.3 Vector與Map匹配 113 6.3.4 Guard 114 6.3.5 Sparkler 114 6.4 代數數據類型(ADT) 116 6.5 小結 118 第7章 Monadic編程 119 7.1 鏈式調用 119 7.1.1 Promise 120 7.1.2 高階Promise 122 7.2 Monad 123 7.2.1 函子(Functor) 123 7.2.2 Applicative Functor 126 7.2.3 含?半群(Monoid) 130 7.2.4 Monad就是容器界的管道 132 7.2.5 Monad就是自函子范疇上的一個?半群 136 7.3 走鋼絲 139 7.3.1 用Monad表示薛定諤貓 139 7.3.2 皮爾斯走鋼絲 140 7.4 Monad在JavaScript中的應用 143 7.4.1 Promise版本的走鋼絲 144 7.4.2 When 144 7.5 Reactive編程 146 7.5.1 流(Stream) 146 7.5.2 Functor 147 7.5.3 Applicative 147 7.5.4 Monad 148 7.5.5 一個“簡單”的Reactive實例 149 7.6 小結 153 第8章 并發編程 154 8.1 什么是并發 154 8.1.1 異步與多線程 155 8.1.2 JavaScript的并發模型 157 8.2 通信順序進程(CSP) 160 8.3 使用Generator實現CSP 162 8.3.1 Generator 163 8.3.2 Go Block 163 8.3.3 timeout 164 8.3.4 take <! 165 8.3.5 put >! 165 8.3.6 JavaScript CSP版本的例子 166 8.4 實戰 CSP 168 8.4.1 使用移植的core.async 168 8.4.2 使用ES7中的異步函數 169 8.4.3 try catch 170 8.5 小結 173 參考資料 174
|
序: |