> 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!
# 關于本書
這本書的主題是函數范式(functional paradigm),我們將使用 JavaScript 這個世界上最流行的函數式編程語言來講述這一主題。有人可能會覺得選擇 JavaScript 并不明智,因為當前的主流觀點認為它是一門命令式(imperative)的語言,并不適合用來講函數式。但我認為,這是學習函數式編程的最好方式,因為:
* **你很有可能在日常工作中使用它**
這讓你有機會在實際的編程過程中學以致用,而不是在空閑時間用一門深奧的函數式編程語言做一些玩具性質的項目。
* **你不必從頭學起就能開始編寫程序**
在純函數式編程語言中,你必須使用 monad 才能打印變量或者讀取 DOM 節點。JavaScript 則簡單得多,可以作弊走捷徑,因為畢竟我們的目的是學寫純函數式代碼。JavaScript 也更容易入門,因為它是一門混合范式的語言,你隨時可以在感覺吃力的時候回退到原有的編程習慣上去。
* **這門語言完全有能力書寫高級的函數式代碼**
只需借助一到兩個微型類庫,JavaScript 就能模擬 Scala 或 Haskell 這類語言的全部特性。雖然面向對象編程(Object-oriented programing)主導著業界,但很明顯這種范式在 JavaScript 里非常笨拙,用起來就像在高速公路上露營或者穿著橡膠套鞋跳踢踏舞一樣。我們不得不到處使用 `bind` 以免 `this` 不知不覺地變了,語言里沒有類可以用(目前還沒有),我們還發明了各種變通方法來應對忘記調用 `new` 關鍵字后的怪異行為,私有成員只能通過閉包(closure)才能實現,等等。對大多數人來說,函數式編程看起來更加自然。
以上說明,強類型的函數式語言毫無疑問將會成為本書所示范式的最佳試驗場。JavaScript 是我們學習這種范式的一種手段,將它應用于什么地方則完全取決于你自己。幸運的是,所有的接口都是數學的,因而也是普適的。最終你會發現你習慣了 swiftz、scalaz、haskell 和 purescript,以及其他各種數學偏向的語言。
### Gitbook (更好的閱讀體驗)
* [在線閱讀](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#介紹)
* [一個簡單例子](ch1.md#一個簡單例子)
* [第 2 章: 一等公民的函數](ch2.md)
* [快速概覽](ch2.md#快速概覽)
* [為何鐘愛一等公民](ch2.md#為何鐘愛一等公民)
* [第 3 章: 純函數的好處](ch3.md)
* [再次強調“純”](ch3.md#再次強調“純”)
* [副作用可能包括...](ch3.md#副作用可能包括)
* [八年級數學](ch3.md#八年級數學)
* [追求“純”的理由](ch3.md#追求“純”的理由)
* [總結](ch3.md#總結)
* [第 4 章: 柯里化(curry)](ch4.md)
* [不可或缺的 curry](ch4.md#不可或缺的-curry)
* [不僅僅是雙關語/咖喱](ch4.md#不僅僅是雙關語咖喱)
* [總結](ch4.md#總結)
* [第 5 章: 代碼組合(compose)](ch5.md)
* [函數飼養](ch5.md#函數飼養)
* [pointfree](ch5.md#pointfree)
* [debug](ch5.md#debug)
* [范疇學](ch5.md#范疇學)
* [總結](ch5.md#總結)
* [第 6章: 示例應用](ch6.md)
* [聲明式代碼](ch6.md#聲明式代碼)
* [一個函數式的 flickr](ch6.md#一個函數式的-flickr)
* [有原則的重構](ch6.md#有原則的重構)
* [總結](ch6.md#總結)
## 第 2 部分
* [第 7 章: Hindley-Milner 類型簽名](ch7.md)
* [初識類型](ch7.md#初識類型)
* [神秘的傳奇故事](ch7.md#神秘的傳奇故事)
* [縮小可能性范圍](ch7.md#縮小可能性范圍)
* [自由定理](ch7.md#自由定理)
* [總結](ch7.md#總結)
* [第 8 章: 特百惠](ch8.md)
* [強大的容器](ch8.md#強大的容器)
* [第一個 functor](ch8.md#第一個-functor)
* [薛定諤的 Maybe](ch8.md#薛定諤的-maybe)
* [“純”錯誤處理](ch8.md#“純”錯誤處理)
* [王老先生有作用...](ch8.md#王老先生有作用)
* [異步任務](ch8.md#異步任務)
* [一點理論](ch8.md#一點理論)
* [總結](ch8.md#總結)
* [第 9 章: Monad](ch9.md)
* [pointed functor](ch9.md#pointed-functor)
* [混合比喻](ch9.md#混合比喻)
* [chain 函數](ch9.md#chain-函數)
* [理論](ch9.md#理論)
* [總結](ch9.md#總結)
* [第 10 章: Applicative Functor](ch10.md)
* [應用 applicative functor](ch10.md#應用-applicative-functor)
* [瓶中之船](ch10.md#瓶中之船)
* [協調與激勵](ch10.md#協調與激勵)
* [lift](ch10.md#lift)
* [免費開瓶器](ch10.md#免費開瓶器)
* [定律](ch10.md#定律)
* [總結](ch10.md#總結)
# 未來計劃
* 第 1 部分:是基礎知識。這是初版草稿,所以我會及時更正發現的的錯誤。歡迎提供幫助!
* 第 2 部分:講述類型類(type class),比如 functor 和 monad,最后會講到到 traversable。我希望能塞進來一些 monad transformer 相關的知識,再寫一個純函數的應用。
* 第 3 部分:將開始游走于編程實踐與學院學究之間。我們將學習 comonad、f-algebra、free monad、yoneda 以及其他一些范疇學概念。