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

Pet*_*iak 24 haskell functional-programming referential-transparency zipper data-structures

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

让我用例子解释一下:

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

有一个简单的(幼稚?)解决方案,类似于他们在XMonad的早期版本中使用的涉及作为解释的有限的地图在这里.

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

Don*_*art 13

Oleg 通过分隔延续的"并发"拉链工作是主要参考.

  • 谢谢,这似乎是我的问题的答案.他们使用新手最担心的所有结构(Monads,Monad Transformers,Continuations,-fglasgow-exts)真是太遗憾了.他们甚至通过调整延续库使事情变得更难.所以我需要一段时间才能理解这一点.如果我可以提出另一个问题,你似乎已经在Haskell场景上待了一段时间了,我会不会觉得我是通过学习Haskell来拍摄自己的一只脚:)(从某种意义上说,这将是如此容易用OO语言实现)? (5认同)
  • @inetic,它只取决于你,它需要学习的奉献精神,但奖励是值得的.此外,您不必完全理解他们在Haskell中享受编程所涉及的所有更高级别的概念. (3认同)
  • "有几个孔的拉链"在http://kmij.org/ftp/continuations/zipper.html#zipper2上的Oleg链接下 (2认同)

Pau*_*son 10

本文.我似乎记得读到某个地方,二阶导数有两个洞,这可能是你想要的.

  • 麦克布赖德的论文当然值得一读.请注意,虽然"区分"结构只是一个Huet拉链的一半:您仍然必须定义导航部分.所有这些工作都是一种手动方式,可以在使用分隔连续时复制您免费获得的内容. (3认同)
  • 我的思绪完全被吹了!这种技术如此简单但如此棒!只计算`fx = f(x ^ 2)`的导数两次得到'f''x = 2*f'(x ^ 2)+(2*x)^ 2*f''(x ^ 2) )`,这是无限树上2个指针所需的拉链数据结构我永远不会想到! (2认同)