前端函数式攻城指南
第1章 函数式JavaScript1
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.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
查看完整
欧阳继超,ThoughtWorks高级咨询师,活跃开源贡献者(github.com/jcouyang),热爱编程与写作,译有《函数式JavaScript》以及若干开源书籍与文档。
在后端,函数式语言层出不穷。在前端,函数式后的边界也已经被渐渐打破。Scala的Scala.js、Clojure的ClojureScript都试图同构移向前端。然而,原生JavaScript其实也可以通过丰富的库让前端的函数式编程一样的舒适和优雅。本书涵盖了大部分函数式编程思想,包括JavaScript的函数式支持,Clojure风格的集合、递归、函数组合、宏、模式匹配、实用的Monads,以及前端的并发编程。本书适合想要了解函数式编程的JavaScript程序员或者想学习JavaScript的函数式程序员阅读。
第1章 函数式JavaScript1
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 ClojureScript16
1.3.3 Mori17
1.4 小结18
第2章 集合19
2.1 集合的使用20
2.1.1 向量(vector)20
2.1.2 Map23
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 函数式React40
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 Trampoline67
3.5 小结69
第4章 函数组合70
4.1 Underscore到底做错了什么70
4.1.1 自由(Free)变量与约束(Bound)变量72
4.1.2 闭包74
4.2 柯里化有什么用75
4.3 Transducer78
4.3.1 Reducer79
4.3.2 来看看更好更快的解法79
4.3.3 Reducer80
4.3.4 Reducible81
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 什么是REPL89
5.1.1 宏扩展器(Macro Expander)90
5.1.2 那么前端怎么办92
5.2 为什么要语法糖93
5.2.1 只是为了语法漂亮吗94
5.3 Sweet.js94
5.3.1 Rule Macro95
5.3.2 Case Macro97
5.4 Infix Macro 和 Operator104
5.4.1 Infix Macro104
5.4.2 自定义操作符105
5.5 小结106
第6章 模式匹配107
6.1 Destructure107
6.1.1 对象109
6.1.2 数组109
6.1.3 函数109
6.2 Arity 函数110
6.3 Fizz Buzz111
6.3.1 字面匹配(Literal Matching)111
6.3.2 绑定113
6.3.3 Vector与Map匹配113
6.3.4 Guard114
6.3.5 Sparkler114
6.4 代数数据类型(ADT)116
6.5 小结118
第7章 Monadic编程119
7.1 链式调用119
7.1.1 Promise120
7.1.2 高阶Promise122
7.2 Monad123
7.2.1 函子(Functor)123
7.2.2 Applicative Functor126
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 When144
7.5 Reactive编程146
7.5.1 流(Stream)146
7.5.2 Functor147
7.5.3 Applicative147
7.5.4 Monad148
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实现CSP162
8.3.1 Generator163
8.3.2 Go Block163
8.3.3 timeout164
8.3.4 take <!165
8.3.5 put >!165
8.3.6 JavaScript CSP版本的例子166
8.4 实战 CSP168
8.4.1 使用移植的core.async168
8.4.2 使用ES7中的异步函数169
8.4.3 try catch170
8.5 小结173
参考资料174
^ 收 起
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 ClojureScript16
1.3.3 Mori17
1.4 小结18
第2章 集合19
2.1 集合的使用20
2.1.1 向量(vector)20
2.1.2 Map23
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 函数式React40
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 Trampoline67
3.5 小结69
第4章 函数组合70
4.1 Underscore到底做错了什么70
4.1.1 自由(Free)变量与约束(Bound)变量72
4.1.2 闭包74
4.2 柯里化有什么用75
4.3 Transducer78
4.3.1 Reducer79
4.3.2 来看看更好更快的解法79
4.3.3 Reducer80
4.3.4 Reducible81
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 什么是REPL89
5.1.1 宏扩展器(Macro Expander)90
5.1.2 那么前端怎么办92
5.2 为什么要语法糖93
5.2.1 只是为了语法漂亮吗94
5.3 Sweet.js94
5.3.1 Rule Macro95
5.3.2 Case Macro97
5.4 Infix Macro 和 Operator104
5.4.1 Infix Macro104
5.4.2 自定义操作符105
5.5 小结106
第6章 模式匹配107
6.1 Destructure107
6.1.1 对象109
6.1.2 数组109
6.1.3 函数109
6.2 Arity 函数110
6.3 Fizz Buzz111
6.3.1 字面匹配(Literal Matching)111
6.3.2 绑定113
6.3.3 Vector与Map匹配113
6.3.4 Guard114
6.3.5 Sparkler114
6.4 代数数据类型(ADT)116
6.5 小结118
第7章 Monadic编程119
7.1 链式调用119
7.1.1 Promise120
7.1.2 高阶Promise122
7.2 Monad123
7.2.1 函子(Functor)123
7.2.2 Applicative Functor126
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 When144
7.5 Reactive编程146
7.5.1 流(Stream)146
7.5.2 Functor147
7.5.3 Applicative147
7.5.4 Monad148
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实现CSP162
8.3.1 Generator163
8.3.2 Go Block163
8.3.3 timeout164
8.3.4 take <!165
8.3.5 put >!165
8.3.6 JavaScript CSP版本的例子166
8.4 实战 CSP168
8.4.1 使用移植的core.async168
8.4.2 使用ES7中的异步函数169
8.4.3 try catch170
8.5 小结173
参考资料174
^ 收 起
欧阳继超,ThoughtWorks高级咨询师,活跃开源贡献者(github.com/jcouyang),热爱编程与写作,译有《函数式JavaScript》以及若干开源书籍与文档。
在后端,函数式语言层出不穷。在前端,函数式后的边界也已经被渐渐打破。Scala的Scala.js、Clojure的ClojureScript都试图同构移向前端。然而,原生JavaScript其实也可以通过丰富的库让前端的函数式编程一样的舒适和优雅。本书涵盖了大部分函数式编程思想,包括JavaScript的函数式支持,Clojure风格的集合、递归、函数组合、宏、模式匹配、实用的Monads,以及前端的并发编程。本书适合想要了解函数式编程的JavaScript程序员或者想学习JavaScript的函数式程序员阅读。
比价列表
公众号、微信群
缺书网
微信公众号
微信公众号
扫码进群
实时获取购书优惠
实时获取购书优惠