用于表示图形的不可变函数数据结构

vas*_*aki 5 functional-programming graph immutability zipper

我(几乎)完全理解树的Zipper数据结构.但是,在一些出版物中,我看到了一些暗示,也可以使用Zipper的想法为任意图形创建不可变的函数数据结构(也可能有周期).

这样做的方法是什么?

只要我们有循环,就意味着可以通过多个路径到达任何节点.因此,如果我专注于一个节点,对它进行一些更改,并将焦点移开,我可能稍后通过不同的路径返回到同一节点,这意味着它将是节点的"旧"版本,在改变之前.

我想出的唯一解决方案是在上下文中包含任何节点的更改列表.每次在焦点更改为节点X之前,应检查X是否是更改列表的成员,如果是,则应将其视为焦点节点.

如果我们还跟踪N节点X从更改列表中复制的次数,我们可以从更改列表中删除X,只要N =边数,向内到X.

有没有更好的方法呢?