搜索
高级检索
高级搜索
书       名 :
著       者 :
出  版  社 :
I  S  B  N:
文献来源:
出版时间 :
前端函数式攻城指南
0.00    
图书来源:
  • 配送范围:
    全国(除港澳台地区)
  • ISBN:
    9787121297243
  • 作      者:
    欧阳继超著
  • 出 版 社 :
    电子工业出版社
  • 出版日期:
    2016
收藏
编辑推荐

1、涵盖大部分函数式编程思想

2、幽默风趣,通俗易懂

3、是Clojure风格的JavaScript

4、用JavaScript实现了很多奇技淫巧

5、所有开发者都可以在本书中找到一些启发


展开
作者简介

欧阳继超,ThoughtWorks高级咨询师,活跃开源贡献者(github.com/jcouyang),热爱编程与写作,译有《函数式JavaScript》以及若干开源书籍与文档。

展开
内容介绍

在后端,函数式语言层出不穷。在前端,函数式最后的边界也已经被渐渐打破。Scala的Scala.js、Clojure的ClojureScript都试图同构移向前端。然而,原生JavaScript其实也可以通过丰富的库让前端的函数式编程一样的舒适和优雅。本书涵盖了大部分函数式编程思想,包括JavaScript的函数式支持,Clojure风格的集合、递归、函数组合、宏、模式匹配、实用的Monads,以及前端的并发编程。本书适合想要了解函数式编程的JavaScript程序员或者想学习JavaScript的函数式程序员阅读。

展开
精彩书评

作为 Ramda.js 的作者之一,我非常喜欢 Braithwaite 的《JavaScript Allonge》,喜欢 Fogus 的《Functional JavaScript》,我非常激动又有一本关于JavaScript的函数式书籍,希望尽快能见到这本书的英文版。 

—— CrossEye


展开
精彩书摘

4.2 柯里化有什么用

还记得上一章提到的提出柯里悖论的 Haskell Curry 吗?这里要说到的柯里化中的 柯里,完全不是巧合,确实就是 Haskell Curry 的姓。借助于利用他的名字命名的语言 Haskell,可以更好地理解柯里化。

在 Haskell 语言中,函数是会自动柯里化的:

max 3 4

其实就是:

(max 3) 4

可以看看 max 与 max 3 函数的类型:

ghci> :t max

max :: Ord a => a -> a -> a

看明白了吗?Ord a => 表示类型约束 a 为可以比较大小的类型,因此 max 的类型可以翻译成:当给定一个 a,会得到 a -> a,即接收一个 a 类型,返回一个 a 类型。接下来再看看 max 3 的类型就好理解了。

ghci> :t max 3

(Num a, Ord a) => a -> a

左侧表示类型约束 a 可以是 Ord 或者 Num,意思是 max 3 还是一个函数,如果给定一个 Ord 或者 Num 类型的参数,则返回一个 Ord 或者 Num 类型。

现在是不是清晰了?在Haskell中,每给定一个参数,函数如果是多参数的,该函数还会返回一个处理余下参数的函数。这就是自动柯里化。

而在 JavaScript(以及大多数语言) 中则不是这样的,如果给定多参函数的部分参数,函数会默认其他参数是 undefined ,而不会返回处理剩余参数的函数。


反正最后都要计算出值,那么柯里化和一次把所有约束添加上有什么区别呢?

再回到上一节的例子,还记得我们要编写一本能拿到所有男性姓名的操作手册吧。我们把_.filter 硬是改写成了柯里化版本的Rfilter,终于可以组合我们的操作手册了:

const getMaleName = _.compose(

              data => _.map(data, d => d.name), // <1>

              Rfilter(d => d.sex == 'male')) // <2>

getMaleName(data)

(1)对于还没有柯里化的_.map就只能说:提取数据的名字,这里的数据等于传入的数据。

(2)我可以明确地在手册里写:过滤出数据中性别为男性的。

对比这两行明显可以看出,第一行特别啰唆,就是因为把本来应该是自由变量的data当约束变量给了_.map函数。相反,Rfilter并不需要data这个自由变量,意义却完全一样,这种方式又叫作“Pointfree”或者“Pointless”。

而且,当柯里化_.filter函数之后,我们实际上得到的是两个函数,而不只是一个。给定一个约束后得到一个新的函数,这个函数就可以拿来组合其他函数,或者再给定不同约束返回不同给定值。

当可组合的函数越多,就能够越大程度地复用现有函数,组合出更多的函数。就像乐高积木,如果买一般的通用乐高,其实可以组合出各式各样的形状,但是一旦有些积木给了一些设定,比如你买了一盒辛普森一家的乐高(图4-1),就很难和生活大爆炸的乐高(图4-2)组合到一块去,因为其中很多积木都添加了一些设定,设定越多,则离抽象越远,离具体越近,也就越难复用。


展开
目录

第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

展开
加入书架成功!
收藏图书成功!
我知道了(3)
发表书评
读者登录

请选择您读者所在的图书馆

选择图书馆
浙江图书馆
点击获取验证码
登录
没有读者证?在线办证