我(几乎)完全理解树的 Zipper 数据结构。然而,在一些出版物中,我看到暗示也可以使用 Zipper 的想法为任意图(也可能有循环)创建不可变的函数数据结构。
有什么办法呢?
一旦我们有了循环,就意味着可以通过多条路径到达任何节点。因此,如果我专注于一个节点,对其进行一些更改,然后将焦点移开,我可能稍后会通过不同的路径回到同一个节点,这意味着它将是该节点的“旧”版本,在进行更改之前。
我想出的唯一解决方案是将任何节点的更改列表包含到上下文中。每次在焦点变更到节点X之前,都要检查X是否是变更列表的成员,如果是,则将其作为焦点节点。
如果我们还跟踪从更改列表中复制 N 个节点 X 的次数,我们可以从更改列表中删除 X,只要 N = 边数,向内移动到 X。
有没有更好的方法呢?