【发布时间】:2012-09-09 14:12:56
【问题描述】:
我正在为“模型”(即具有某种语义的框和线的集合,例如 UML,其细节在这里无关紧要)编写一个图形编辑器。所以我想要一个表示模型的数据结构和一个图表,其中对图表的编辑会导致模型发生相应的变化。因此,例如,如果模型元素的属性中有一些文本,而我在图表中编辑文本,我希望更新模型元素。
模型可能会表示为一棵树,但我希望图表编辑器尽可能少地了解模型表示。 (我使用的是diagrams 框架,因此将任意信息与图形元素关联起来很容易)。如果我能弄清楚应该是什么,可能会有一个“模型”类来对接口进行编码。
如果我用命令式语言来做这件事,那就很简单了:我只需要从图表中的图形元素到模型元素的引用。理论上,我仍然可以通过从大量 IORef 集合中构建模型来做到这一点,但这将是在 Haskell 中编写 Java 程序。
很明显,每个图形元素都会有某种 cookie 与之相关联,这将使模型更新发生。一个简单的答案是给每个模型元素一个唯一的标识符并将模型存储在 Data.Map 查找表中。但这需要大量的簿记以确保没有两个模型元素获得相同的标识符。我也觉得它是一个"stringly typed" 解决方案;您必须处理对象被删除但在其他地方有悬空引用的情况,并且很难说出您的类型中模型的内部结构。
另一方面,Oleg's writings 关于带有多个孔的拉链和具有清晰事务共享的游标听起来是一个更好的选择,如果我能理解的话。我了解了列表和树拉链的基本概念以及数据结构的差异化。图表中的每个元素是否有可能将光标放入模型的拉链中?因此,如果进行了更改,则可以将其提交给所有其他游标?包括树操作(例如将子树从一个地方移动到另一个地方)?
如果有某种关于定界延续的教程,以及它们如何使 Oleg 的多光标拉链工作的解释,这将特别帮助我,这比 Oleg 的帖子稍微不那么陡峭?
【问题讨论】:
-
也许是钟杰山的博客? :conway.rutgers.edu/~ccshan/wiki/blog/posts/WalkZip1。请注意,Blobs (wxHaskell) 是一个用于编写“网络编辑器”的库——它可能已经有点腐烂了,但更新它可能比使用 Diagrams 重新开始要少。
-
谢谢。我已经开始解决它了。如果有答案,我会告诉你的。
标签: haskell data-structures zipper