Skip to content

Commit

Permalink
chore: update TOC
Browse files Browse the repository at this point in the history
  • Loading branch information
天默 authored and llh911001 committed Jun 29, 2021
1 parent 7b6ec14 commit a151ec0
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 14 deletions.
22 changes: 21 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

# 关于本书

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

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

Expand Down Expand Up @@ -90,6 +90,26 @@
* [免费开瓶器](ch10.md#免费开瓶器)
* [定律](ch10.md#定律)
* [总结](ch10.md#总结)
* [第 11 章: 再转换一次,就很自然](ch11.md)
* [令人生厌的嵌套](ch11.md#令人生厌的嵌套)
* [一场情景喜剧](ch11.md#一场情景喜剧)
* [全都很自然](ch11.md#全都很自然)
* [有原则的类型转换](ch11.md#有原则的类型转换)
* [方法狂](ch11.md#方法狂)
* [同构的 JavaScript](ch11.md#同构的-javascript)
* [更加宽泛的定义](ch11.md#更加宽泛的定义)
* [实现单层嵌套的方法](ch11.md#实现单层嵌套的方法)
* [总结](ch11.md#总结)
* [第 12 章: 遍历](ch12.md)
* [类型与类型](ch12.md#类型与类型)
* [类型风水](ch12.md#类型风水)
* [作用组合](ch12.md#作用组合)
* [类型的华尔兹](ch12.md#类型的华尔兹)
* [定律](ch12.md#定律)
* [同一律](ch12.md#同一律-identity)
* [组合](ch12.md#组合-composition)
* [自然](ch12.md#自然-naturality)
* [总结](ch12.md#总结)


# 未来计划
Expand Down
25 changes: 21 additions & 4 deletions SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,28 @@
* [第 10 章: Applicative Functor](ch10.md)
* [应用 applicative functor](ch10.md#应用-applicative-functor)
* [瓶中之船](ch10.md#瓶中之船)
* [协调于激励](ch10.md#协调于激励)
* [协调与激励](ch10.md#协调与激励)
* [lift](ch10.md#lift)
* [免费开瓶器](ch10.md#免费开瓶器)
* [定律](ch10.md#定律)
* [总结](ch10.md#总结)



* [第 11 章: 再转换一次,就很自然](ch11.md)
* [令人生厌的嵌套](ch11.md#令人生厌的嵌套)
* [一场情景喜剧](ch11.md#一场情景喜剧)
* [全都很自然](ch11.md#全都很自然)
* [有原则的类型转换](ch11.md#有原则的类型转换)
* [方法狂](ch11.md#方法狂)
* [同构的 JavaScript](ch11.md#同构的-javascript)
* [更加宽泛的定义](ch11.md#更加宽泛的定义)
* [实现单层嵌套的方法](ch11.md#实现单层嵌套的方法)
* [总结](ch11.md#总结)
* [第 12 章: 遍历](ch12.md)
* [类型与类型](ch12.md#类型与类型)
* [类型风水](ch12.md#类型风水)
* [作用组合](ch12.md#作用组合)
* [类型的华尔兹](ch12.md#类型的华尔兹)
* [定律](ch12.md#定律)
* [同一律](ch12.md#同一律-identity)
* [组合](ch12.md#组合-composition)
* [自然](ch12.md#自然-naturality)
* [总结](ch12.md#总结)
5 changes: 2 additions & 3 deletions ch10.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Applicative Functor
# 第 10 章:Applicative Functor

## 应用 applicative functor

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

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

[Chapter 11: Traversable/Foldable Functors](ch11.md)

[Chapter 11: Transformation Again, Naturally](ch11.md)


## 练习
Expand Down
10 changes: 5 additions & 5 deletions ch11.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ const arrayToMaybe = x => Maybe.of(x[0]);

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

## 方法狂 Feature Envy
## 方法狂

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

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

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

## 同构的 JavaScript Isomorphic JavaScript
## 同构的 JavaScript

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

```js
// promiseToTask :: Promise a b -> Task a b
Expand Down Expand Up @@ -175,9 +175,9 @@ const saveComment = compose(

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

## 小结
## 总结

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

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

Expand Down
2 changes: 1 addition & 1 deletion ch12.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ const getControlNode = compose(

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

### 同一律 (identity)
### 同一律 (Identity)

```js
const identity1 = compose(sequence(Identity.of), map(Identity.of));
Expand Down

0 comments on commit a151ec0

Please sign in to comment.