Skip to content

Commit

Permalink
[docs] 反应网编程 -- 完成 DiffList 的讲解
Browse files Browse the repository at this point in the history
  • Loading branch information
xieyuheng committed Sep 5, 2023
1 parent 1e7a052 commit f6c0ef7
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 8 deletions.
1 change: 0 additions & 1 deletion TODO.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# articles

[docs] 反应网编程 -- 完成 `DiffList` 的讲解
[docs] 反应网编程 -- 总结

[docs] translate the article -- section #2
Expand Down
43 changes: 36 additions & 7 deletions docs/articles/反应网编程.md
Original file line number Diff line number Diff line change
Expand Up @@ -829,6 +829,8 @@ three three mul
下面我们在自然数 `Nat` 这个最简单的数据之后,
介绍几乎是第二简单的数据 -- 链表 `List`

主要实现一个 `append` 函数,来将两个链表连接起来。

在演算场中渲染出来的图中,
我们可以明显看到 `List``(append)`
`Nat``(add)` 非常相似。
Expand Down Expand Up @@ -893,14 +895,41 @@ append @run $result

# 12

TODO `DiffList` -- 对表达式与图的反思 -- 简单的图也是双线连接的表达式。
想要用 `(append)` 将两个 `List` 连接起来,
需要遍历 `(append)``target`
一步一步构造一个新的链表连,
接到 `(append)``rest` 前面。

这样,运算所需要的时间与前一个链表的长度成正比。
可不可以将前一个链表直接与后一个链表连接起来呢?
这样应该只需要固定的几步就可以完成计算。

我们可以定义一个新的数据类型 `DiffList`
和一个新的节点 `diff_list`
这个节点用来可以抓着一个 `List` 的头和尾。
如果有两个 `DiffList`
只要把第一个 `diff_list` 抓着的尾,
和第二个 `diff_list` 抓着的头相连即可。

注意,在一般的程序语言中,经常用树状结构的表达式来作为数据,
从树的父节点可以找到子节点,但是反之不行。
而在反应网中,所有节点之间的关系是对称的。

在下面的代码中,在一次调用 `cons` 时,
我们写成了 `(cons :tail)` 而不是直接写 `cons`
这代表在调用这个节点之前,重新排列这个节点的接口,
将原本是输入接口的 `:tail` 作为输出接口。

在下面的代码中我们还使用了一个短语:

```
... $value @connect value ...
```

它的意思是,先把栈顶的值保存在 `$value` 中,
然后将栈顶的两个接口相连,
最后再把保存在 `$value` 中的值放回栈中。

Concatenation of lists is performed in linear time
with respect to its first argument.
Constant time concatenation is possible
with difference-lists: the idea consists in
plugging the front of the second argument
at the back of the first one.

[去 `DiffList` 与 `(diff_append)` 的演算场](https://inet.run/playground/aW1wb3J0IExpc3QgZnJvbSAiaHR0cHM6Ly9jZG4uaW5ldC5ydW4vdGVzdHMvZGF0YXR5cGUvTGlzdC5pIgoKdHlwZSBEaWZmTGlzdCBAVHlwZSAtLSBAVHlwZSBlbmQKCm5vZGUgZGlmZgogICdBIExpc3QgOmZyb250CiAgLS0tLS0tLQogICdBIExpc3QgOmJhY2sKICAnQSBEaWZmTGlzdCA6dmFsdWUhCmVuZAoKbm9kZSBkaWZmX2FwcGVuZAogICdBIERpZmZMaXN0IDp0YXJnZXQhCiAgJ0EgRGlmZkxpc3QgOnJlc3QKICAtLS0tLS0tLQogICdBIERpZmZMaXN0IDpyZXR1cm4KZW5kCgpub2RlIGRpZmZfb3BlbgogICdBIERpZmZMaXN0IDp0YXJnZXQhCiAgJ0EgTGlzdCA6bGlzdAogIC0tLS0tLS0tLS0KICAnQSBMaXN0IDpyZXR1cm4KZW5kCgpydWxlIGRpZmYgZGlmZl9hcHBlbmQKICAoZGlmZiktZnJvbnQgZGlmZiByZXR1cm4tKGRpZmZfYXBwZW5kKQogIChkaWZmX2FwcGVuZCktcmVzdCBkaWZmX29wZW4gYmFjay0oZGlmZikKZW5kCgpydWxlIGRpZmYgZGlmZl9vcGVuCiAgKGRpZmYpLWJhY2sgbGlzdC0oZGlmZl9vcGVuKQogIChkaWZmKS1mcm9udCByZXR1cm4tKGRpZmZfb3BlbikKZW5kCgppbXBvcnQgemVybyBmcm9tICJodHRwczovL2Nkbi5pbmV0LnJ1bi90ZXN0cy9kYXRhdHlwZS9OYXQuaSIKaW1wb3J0IGNvbnMgZnJvbSAiaHR0cHM6Ly9jZG4uaW5ldC5ydW4vdGVzdHMvZGF0YXR5cGUvTGlzdC5pIgoKemVybyAoY29ucyA6dGFpbCkgemVybyBjb25zIGRpZmYgJHZhbHVlIEBjb25uZWN0IHZhbHVlCnplcm8gKGNvbnMgOnRhaWwpIHplcm8gY29ucyBkaWZmICR2YWx1ZSBAY29ubmVjdCB2YWx1ZQpkaWZmX2FwcGVuZAoKemVybyAoY29ucyA6dGFpbCkgemVybyBjb25zIGRpZmYgJHZhbHVlIEBjb25uZWN0IHZhbHVlCnplcm8gKGNvbnMgOnRhaWwpIHplcm8gY29ucyBkaWZmICR2YWx1ZSBAY29ubmVjdCB2YWx1ZQpkaWZmX2FwcGVuZCBAcnVuICRyZXN1bHQ)

Expand Down

0 comments on commit f6c0ef7

Please sign in to comment.