第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
· · · · · · (
收起)
1 有用 iambowen 2016-10-12 17:43:13
同事写的书,国庆放假期间读了一遍,收获颇多,虽然很多理论知识如Y不动点,Monad还没有办法完全理解,但是可以发现,函数式编程将逐渐成为未来发展的方向,不管是后端或者前端。
3 有用 DaraW 2017-10-29 00:35:16
很棒的一本书,但看之前最好有一些基础知识作为铺垫,以及要有足够的兴趣,否则看起来可能会比较吃力。
1 有用 Poplar_hills 2019-12-30 13:01:37
今年读过的最差的技术书籍,作者完全不具备写作素养,写出来的东西只是给自己看的
0 有用 黑白猪 2019-03-19 07:53:28
作者写的意犹未尽,他的技术确实牛b,也尝试写的很亲民,但是没点卵用。多看看阮一峰的写作风格
2 有用 辻彩 2016-10-22 18:00:43
相当于mostly adequate guide,图画很有趣,但是拼写错误也太多了,希望能有个勘误表
0 有用 RRRSSS 2022-11-24 15:12:35 新加坡
这本书我是 17 年买的,看了第一章之后就看不下去了,最近又捡了起来,2 天读完,果然,自己还是进步了。 全文基本上都有 Clojure 代码,没有基础的人,谨慎阅读。可以看出作者对这个领域是有研究的,Clojure 的确是入门函数式的一个好语言。不过,既然都是给前端读的,可能选用 ClojureScript 会更好点吧。 函数式的内容太大了,的确一本书是不够的。这本书看完让我把 Clojure... 这本书我是 17 年买的,看了第一章之后就看不下去了,最近又捡了起来,2 天读完,果然,自己还是进步了。 全文基本上都有 Clojure 代码,没有基础的人,谨慎阅读。可以看出作者对这个领域是有研究的,Clojure 的确是入门函数式的一个好语言。不过,既然都是给前端读的,可能选用 ClojureScript 会更好点吧。 函数式的内容太大了,的确一本书是不够的。这本书看完让我把 Clojure 又复习了一遍。 (展开)
0 有用 Snowflyt 2022-11-13 13:20:35 江苏
很好的一本书,就是要对上电波才能看着爽……阅读本书需要一点对FP的基本认识,对LISP有一些了解,而且读者本身也需要接触偏杂的一些基本概念,否则很容易在阅读过程中因为不了解某个被一笔带过的概念而卡住,而作者在行文过程中对此毫无自觉……如果掌握了上述前置知识,这其实是一本读着深入浅出又不乏幽默感的好书,尤其是Monoid一章我感觉写得非常好。只能说受众定位错了,看到这本书的多数读者是很难读懂书里在写... 很好的一本书,就是要对上电波才能看着爽……阅读本书需要一点对FP的基本认识,对LISP有一些了解,而且读者本身也需要接触偏杂的一些基本概念,否则很容易在阅读过程中因为不了解某个被一笔带过的概念而卡住,而作者在行文过程中对此毫无自觉……如果掌握了上述前置知识,这其实是一本读着深入浅出又不乏幽默感的好书,尤其是Monoid一章我感觉写得非常好。只能说受众定位错了,看到这本书的多数读者是很难读懂书里在写什么的,只会觉得作者在自嗨,自己又读着很痛苦……书中有一些typo,一些地方思维有点过于跳脱,不容易跟上,但总体确实相当精彩。说实话我读了一小半的时候来豆瓣看到这么低的评分真给吓了一跳,不知道为啥这么低,看完之后意识到这是受众选错了,而且出版社给的这封面确实没啥品味,怪不得滞销呢 (展开)
0 有用 寒号鸟 2022-06-28 14:24:04
这书我觉得写的非常容易懂,比外国人写的好,不知道为啥打低分
1 有用 Poplar_hills 2019-12-30 13:01:37
今年读过的最差的技术书籍,作者完全不具备写作素养,写出来的东西只是给自己看的
0 有用 黑白猪 2019-03-19 07:53:28
作者写的意犹未尽,他的技术确实牛b,也尝试写的很亲民,但是没点卵用。多看看阮一峰的写作风格