Skip to content

Commit 76159c0

Browse files
committed
chore: update TOC and some others
1 parent 7b6ec14 commit 76159c0

File tree

5 files changed

+50
-14
lines changed

5 files changed

+50
-14
lines changed

README.md

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
# 关于本书
77

8-
这本书的主题是函数范式(functional paradigm),我们将使用 JavaScript 这个世界上最流行的函数式编程语言来讲述这一主题。有人可能会觉得选择 JavaScript 并不明智,因为当前的主流观点认为它是一门命令式(imperative)的语言,并不适合用来讲函数式。但我认为,这是学习函数式编程的最好方式,因为:
8+
这本书的主题是函数范式(functional paradigm),我们将使用 JavaScript 这门世界上最流行的函数式编程语言来讲述这一主题。有人可能会觉得选择 JavaScript 并不明智,因为当前的主流观点认为它是一门命令式(imperative)的语言,并不适合用来讲函数式。但我认为,这是学习函数式编程的最好方式,因为:
99

1010
* **你很有可能在日常工作中使用它**
1111

@@ -90,6 +90,26 @@
9090
* [免费开瓶器](ch10.md#免费开瓶器)
9191
* [定律](ch10.md#定律)
9292
* [总结](ch10.md#总结)
93+
* [第 11 章: 再转换一次,就很自然](ch11.md)
94+
* [令人生厌的嵌套](ch11.md#令人生厌的嵌套)
95+
* [一场情景喜剧](ch11.md#一场情景喜剧)
96+
* [全都很自然](ch11.md#全都很自然)
97+
* [有原则的类型转换](ch11.md#有原则的类型转换)
98+
* [方法狂](ch11.md#方法狂)
99+
* [同构的 JavaScript](ch11.md#同构的-javascript)
100+
* [更加宽泛的定义](ch11.md#更加宽泛的定义)
101+
* [实现单层嵌套的方法](ch11.md#实现单层嵌套的方法)
102+
* [总结](ch11.md#总结)
103+
* [第 12 章: 遍历](ch12.md)
104+
* [类型与类型](ch12.md#类型与类型)
105+
* [类型风水](ch12.md#类型风水)
106+
* [作用组合](ch12.md#作用组合)
107+
* [类型的华尔兹](ch12.md#类型的华尔兹)
108+
* [定律](ch12.md#定律)
109+
* [同一律](ch12.md#同一律-identity)
110+
* [组合](ch12.md#组合-composition)
111+
* [自然](ch12.md#自然-naturality)
112+
* [总结](ch12.md#总结)
93113

94114

95115
# 未来计划

SUMMARY.md

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,28 @@
5151
* [第 10 章: Applicative Functor](ch10.md)
5252
* [应用 applicative functor](ch10.md#应用-applicative-functor)
5353
* [瓶中之船](ch10.md#瓶中之船)
54-
* [协调于激励](ch10.md#协调于激励)
54+
* [协调与激励](ch10.md#协调与激励)
5555
* [lift](ch10.md#lift)
5656
* [免费开瓶器](ch10.md#免费开瓶器)
5757
* [定律](ch10.md#定律)
5858
* [总结](ch10.md#总结)
59-
60-
61-
59+
* [第 11 章: 再转换一次,就很自然](ch11.md)
60+
* [令人生厌的嵌套](ch11.md#令人生厌的嵌套)
61+
* [一场情景喜剧](ch11.md#一场情景喜剧)
62+
* [全都很自然](ch11.md#全都很自然)
63+
* [有原则的类型转换](ch11.md#有原则的类型转换)
64+
* [方法狂](ch11.md#方法狂)
65+
* [同构的 JavaScript](ch11.md#同构的-javascript)
66+
* [更加宽泛的定义](ch11.md#更加宽泛的定义)
67+
* [实现单层嵌套的方法](ch11.md#实现单层嵌套的方法)
68+
* [总结](ch11.md#总结)
69+
* [第 12 章: 遍历](ch12.md)
70+
* [类型与类型](ch12.md#类型与类型)
71+
* [类型风水](ch12.md#类型风水)
72+
* [作用组合](ch12.md#作用组合)
73+
* [类型的华尔兹](ch12.md#类型的华尔兹)
74+
* [定律](ch12.md#定律)
75+
* [同一律](ch12.md#同一律-identity)
76+
* [组合](ch12.md#组合-composition)
77+
* [自然](ch12.md#自然-naturality)
78+
* [总结](ch12.md#总结)

ch10.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Applicative Functor
1+
# 第 10 章:Applicative Functor
22

33
## 应用 applicative functor
44

@@ -338,8 +338,7 @@ IO.of(_.compose).ap(u).ap(v).ap(w) == u.ap(v.ap(w))
338338

339339
至此我们已经基本介绍完容器的 api 了,我们学会了如何对函数调用 `map``chain``ap`。下一章,我们将学习如何更好地处理多个 functor,以及如何以一种原则性的方式拆解它们。
340340

341-
[Chapter 11: Traversable/Foldable Functors](ch11.md)
342-
341+
[Chapter 11: Transformation Again, Naturally](ch11.md)
343342

344343

345344
## 练习

ch11.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ const arrayToMaybe = x => Maybe.of(x[0]);
7979

8080
从另一个角度来看,转换的是某个作用(effects)。由此可以认为,`ioToTask`就是从同步到异步的转换,和`arrayToMaybe`是从非确定性到可能失败。要注意的是,在`JavaScript` 里,并不能把异步变到同步,无法实现`taskToIO`方法,那是个"超自然"变换。
8181

82-
## 方法狂 Feature Envy
82+
## 方法狂
8383

8484
假设要使用一些其他类型的方法(feature),比如对一个`List`进行`sortBy`*Natural Transformations* 提供了变换为目标类型的巧妙方式,只要该类型支持`map`操作。
8585

@@ -95,9 +95,9 @@ const doListyThings_ = compose(sortBy(h), filter(g), map(f), arrayToList); // la
9595

9696
此外,如`doListyThings_`所示,将映射操作`map(f)`移到 *Natural Transformations* 的左边,更加容易实现函数的优化或者复合。
9797

98-
## 同构的 JavaScript Isomorphic JavaScript
98+
## 同构的 JavaScript
9999

100-
当把一个值前后怎么转换都不会丢失任何数据时,可称之为 *同构 Isomorphic* 。看上去挺高大上,不过就是“保持相同的数据”而已。如果两个类型在 *Natural Transformations* 中既可以`to`也可以`from` ,就被称之为是 *同构 Isomorphic* ,证明如下:
100+
当把一个值前后怎么转换都不会丢失任何数据时,可称之为 *同构*(isomorphic) 。看上去挺高大上,不过就是“保持相同的数据”而已。如果两个类型在 *Natural Transformations* 中既可以`to`也可以`from` ,就被称之为是 *同构* ,证明如下:
101101

102102
```js
103103
// promiseToTask :: Promise a b -> Task a b
@@ -175,9 +175,9 @@ const saveComment = compose(
175175

176176
这里具体的操作仅仅加入了`chain(maybeToTask)``chain(eigherToTack)`。都是同样的效果。在`join`时很自然的将`Task`的 functor 转换到另一个`Task`的 functor。就像窗边的尖刺驱鸟器,从源头扼杀了嵌套。就像他们巴黎(city of the light)人说的:“Mieux vaut prévenir que guérir” - 花一英镑去治疗不如花一盎司用于预防。
177177

178-
## 小结
178+
## 总结
179179

180-
*Natural Transformations*是操作 functor 的方法。在范畴学中是非常重要的概念,特别是采用多种抽象化机制时,就会用的更多。上述例子,仅仅局限于几个具体的应用中。如上文所言,只要转换类型时,确保可组合性,即可以实现所需要的不同作用 effects。同时可以解决嵌套问题,虽然会将类型同化到最低的共同母类(lowest common denominator),在实际应用中,一般是作用最易变的函子(通常是`Task` )(functor with most volatile effects)。
180+
*Natural Transformations* 是操作 functor 的方法。在范畴学中是非常重要的概念,特别是采用多种抽象化机制时,就会用的更多。上述例子,仅仅局限于几个具体的应用中。如上文所言,只要转换类型时,确保可组合性,即可以实现所需要的不同作用 effects。同时可以解决嵌套问题,虽然会将类型同化到最低的共同母类(lowest common denominator),在实际应用中,一般是作用最易变的函子(通常是`Task` )(functor with most volatile effects)。
181181

182182
这种连续而冗长的类型是实现的代价 - 从以太中召唤而来。当然,隐式作用(implicit effects)更有潜在风险,所以也算是合理的方案。不过,如果想归并大量类型,还需要更多的工具。之后,我们将通过 *Traverable* 讨论重组类型。
183183

ch12.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ const getControlNode = compose(
188188

189189
来吧,我们有一些定律要研究。
190190

191-
### 同一律 (identity)
191+
### 同一律 (Identity)
192192

193193
```js
194194
const identity1 = compose(sequence(Identity.of), map(Identity.of));

0 commit comments

Comments
 (0)