> This is the Simplified Chinese translation of *[mostly-adequate-guide](https://github.com/DrBoolean/mostly-adequate-guide)*, thank Professor [Franklin Risby](https://github.com/DrBoolean) for his great work!
# 關(guān)于本書
這本書的主題是函數(shù)范式(functional paradigm),我們將使用 JavaScript 這個(gè)世界上最流行的函數(shù)式編程語言來講述這一主題。有人可能會(huì)覺得選擇 JavaScript 并不明智,因?yàn)楫?dāng)前的主流觀點(diǎn)認(rèn)為它是一門命令式(imperative)的語言,并不適合用來講函數(shù)式。但我認(rèn)為,這是學(xué)習(xí)函數(shù)式編程的最好方式,因?yàn)椋?
* **你很有可能在日常工作中使用它**
這讓你有機(jī)會(huì)在實(shí)際的編程過程中學(xué)以致用,而不是在空閑時(shí)間用一門深?yuàn)W的函數(shù)式編程語言做一些玩具性質(zhì)的項(xiàng)目。
* **你不必從頭學(xué)起就能開始編寫程序**
在純函數(shù)式編程語言中,你必須使用 monad 才能打印變量或者讀取 DOM 節(jié)點(diǎn)。JavaScript 則簡單得多,可以作弊走捷徑,因?yàn)楫吘刮覀兊哪康氖菍W(xué)寫純函數(shù)式代碼。JavaScript 也更容易入門,因?yàn)樗且婚T混合范式的語言,你隨時(shí)可以在感覺吃力的時(shí)候回退到原有的編程習(xí)慣上去。
* **這門語言完全有能力書寫高級的函數(shù)式代碼**
只需借助一到兩個(gè)微型類庫,JavaScript 就能模擬 Scala 或 Haskell 這類語言的全部特性。雖然面向?qū)ο缶幊蹋∣bject-oriented programing)主導(dǎo)著業(yè)界,但很明顯這種范式在 JavaScript 里非常笨拙,用起來就像在高速公路上露營或者穿著橡膠套鞋跳踢踏舞一樣。我們不得不到處使用 `bind` 以免 `this` 不知不覺地變了,語言里沒有類可以用(目前還沒有),我們還發(fā)明了各種變通方法來應(yīng)對忘記調(diào)用 `new` 關(guān)鍵字后的怪異行為,私有成員只能通過閉包(closure)才能實(shí)現(xiàn),等等。對大多數(shù)人來說,函數(shù)式編程看起來更加自然。
以上說明,強(qiáng)類型的函數(shù)式語言毫無疑問將會(huì)成為本書所示范式的最佳試驗(yàn)場。JavaScript 是我們學(xué)習(xí)這種范式的一種手段,將它應(yīng)用于什么地方則完全取決于你自己。幸運(yùn)的是,所有的接口都是數(shù)學(xué)的,因而也是普適的。最終你會(huì)發(fā)現(xiàn)你習(xí)慣了 swiftz、scalaz、haskell 和 purescript,以及其他各種數(shù)學(xué)偏向的語言。
### Gitbook (更好的閱讀體驗(yàn))
* [在線閱讀](https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/)
* [下載EPUB](https://www.gitbook.com/download/epub/book/llh911001/mostly-adequate-guide-chinese)
* [下載Mobi (Kindle)](https://www.gitbook.com/download/mobi/book/llh911001/mostly-adequate-guide-chinese)
# 目錄
## 第 1 部分
* [第 1 章: 我們在做什么?](ch1.md)
* [介紹](ch1.md#介紹)
* [一個(gè)簡單例子](ch1.md#一個(gè)簡單例子)
* [第 2 章: 一等公民的函數(shù)](ch2.md)
* [快速概覽](ch2.md#快速概覽)
* [為何鐘愛一等公民](ch2.md#為何鐘愛一等公民)
* [第 3 章: 純函數(shù)的好處](ch3.md)
* [再次強(qiáng)調(diào)“純”](ch3.md#再次強(qiáng)調(diào)“純”)
* [副作用可能包括...](ch3.md#副作用可能包括)
* [八年級數(shù)學(xué)](ch3.md#八年級數(shù)學(xué))
* [追求“純”的理由](ch3.md#追求“純”的理由)
* [總結(jié)](ch3.md#總結(jié))
* [第 4 章: 柯里化(curry)](ch4.md)
* [不可或缺的 curry](ch4.md#不可或缺的-curry)
* [不僅僅是雙關(guān)語/咖喱](ch4.md#不僅僅是雙關(guān)語咖喱)
* [總結(jié)](ch4.md#總結(jié))
* [第 5 章: 代碼組合(compose)](ch5.md)
* [函數(shù)飼養(yǎng)](ch5.md#函數(shù)飼養(yǎng))
* [pointfree](ch5.md#pointfree)
* [debug](ch5.md#debug)
* [范疇學(xué)](ch5.md#范疇學(xué))
* [總結(jié)](ch5.md#總結(jié))
* [第 6章: 示例應(yīng)用](ch6.md)
* [聲明式代碼](ch6.md#聲明式代碼)
* [一個(gè)函數(shù)式的 flickr](ch6.md#一個(gè)函數(shù)式的-flickr)
* [有原則的重構(gòu)](ch6.md#有原則的重構(gòu))
* [總結(jié)](ch6.md#總結(jié))
## 第 2 部分
* [第 7 章: Hindley-Milner 類型簽名](ch7.md)
* [初識(shí)類型](ch7.md#初識(shí)類型)
* [神秘的傳奇故事](ch7.md#神秘的傳奇故事)
* [縮小可能性范圍](ch7.md#縮小可能性范圍)
* [自由定理](ch7.md#自由定理)
* [總結(jié)](ch7.md#總結(jié))
* [第 8 章: 特百惠](ch8.md)
* [強(qiáng)大的容器](ch8.md#強(qiáng)大的容器)
* [第一個(gè) functor](ch8.md#第一個(gè)-functor)
* [薛定諤的 Maybe](ch8.md#薛定諤的-maybe)
* [“純”錯(cuò)誤處理](ch8.md#“純”錯(cuò)誤處理)
* [王老先生有作用...](ch8.md#王老先生有作用)
* [異步任務(wù)](ch8.md#異步任務(wù))
* [一點(diǎn)理論](ch8.md#一點(diǎn)理論)
* [總結(jié)](ch8.md#總結(jié))
* [第 9 章: Monad](ch9.md)
* [pointed functor](ch9.md#pointed-functor)
* [混合比喻](ch9.md#混合比喻)
* [chain 函數(shù)](ch9.md#chain-函數(shù))
* [理論](ch9.md#理論)
* [總結(jié)](ch9.md#總結(jié))
* [第 10 章: Applicative Functor](ch10.md)
* [應(yīng)用 applicative functor](ch10.md#應(yīng)用-applicative-functor)
* [瓶中之船](ch10.md#瓶中之船)
* [協(xié)調(diào)與激勵(lì)](ch10.md#協(xié)調(diào)與激勵(lì))
* [lift](ch10.md#lift)
* [免費(fèi)開瓶器](ch10.md#免費(fèi)開瓶器)
* [定律](ch10.md#定律)
* [總結(jié)](ch10.md#總結(jié))
# 未來計(jì)劃
* 第 1 部分:是基礎(chǔ)知識(shí)。這是初版草稿,所以我會(huì)及時(shí)更正發(fā)現(xiàn)的的錯(cuò)誤。歡迎提供幫助!
* 第 2 部分:講述類型類(type class),比如 functor 和 monad,最后會(huì)講到到 traversable。我希望能塞進(jìn)來一些 monad transformer 相關(guān)的知識(shí),再寫一個(gè)純函數(shù)的應(yīng)用。
* 第 3 部分:將開始游走于編程實(shí)踐與學(xué)院學(xué)究之間。我們將學(xué)習(xí) comonad、f-algebra、free monad、yoneda 以及其他一些范疇學(xué)概念。
