第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
      · · · · · ·     (
收起)