Zipper类似于具有多个游标的数​​据结构

时间:2010-08-08 23:54:07

标签: data-structures haskell functional-programming referential-transparency zipper

当想要遍历树并保持当前位置时,Zipper数据结构很棒,但是如果想要跟踪多个位置,应该使用哪种数据结构?

让我用例子来解释:

  • #haskell频道的某个人告诉我,在yi编辑器中使用拉链来表示 光标位置。这很棒,但是如果你想拥有两个,那该怎么办? 游标。就像你想要代表一个选择一样,你需要知道开头和 选择结束。
  • 在wikibooks的Minotaur示例中,他们使用Zipper来表示Minotaur在迷宫内的位置。如果我想将敌人添加到迷宫中,用拉链代表他们的位置就会有意义。
  • 最后一个实际上来自我的迷你项目,它开始了:作为学习Haskell的一部分,我正在尝试使用cairo和gth2hs可视化树结构。到目前为止这已经很好了,但是现在我想选择一个或多个节点并且能够例如移动它们。因为可以有多个选定的节点,我不能只使用它 Zipper在教科书中定义。

有一个简单的(天真的?)解决方案,类似于他们在早期版本的XMonad中使用的解决方案,它涉及有限地图,如here所述。

即,例如在我的示例项目的情况下,我将所选节点存储在索引映射中,并用索引替换它们在主结构中的表示。但是这种解决方案有很多缺点。就像上面链接中解释的那样,或者说,在我的例子的情况下,取消选择所有节点将需要搜索整个树。

2 个答案:

答案 0 :(得分:13)

Oleg在"concurrent" zippers via delimited continuations上的工作是主要参考。

答案 1 :(得分:10)

this paper 。我似乎记得在某处读到二阶导数有两个洞,这可能是你想要的。