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

让我举例说明:


  • #haskell channel 上的某人告诉我,yi编辑器中使用 zipper 来表示
    光标位置。太好了,但是如果您想拥有两个
    游标。就像您要代表一个选择一样,您需要知道开头和
    选择的结尾。

  • 在Wikibooks的Minotaur示例中,他们使用Zipper来表示Minotaur在迷宫中的位置。如果我想将敌人添加到迷宫中,那么用 zipper 表示他们的位置将是很有意义的。

  • 最后一个实际上是从我的迷你项目开始的:在学习Haskell的过程中,我试图使用cairo和gth2hs可视化树结构。到目前为止,一切进展顺利,但现在我想选择一个或多个节点,并能够例如移动它们。因为可以有多个节点,所以我不能只使用其中一个
    教科书中定义的 zipper 。

  • 有一个简单的(天真?)解决方案,类似于他们在XMonad早期版本中使用的解决方案,该解决方案涉及here所解释的有限映射。

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

    最佳答案

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

    关于data-structures - 像 zipper 一样具有多个光标的数据结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3436559/

    10-11 04:22