什么haskell数据结构来存储可变树

时间:2013-02-12 00:38:23

标签: haskell dom data-structures tree ioref

我在考虑在haskell中编写浏览器。中央数据结构将是表示文档的可变树。除了使用完全由iorefs组成的树之外,还有更好的解决方案吗?

我希望避免这样的事情:data DomNode = DomNode TagName NodeProperties (IORef DomNode) [IORef DomNode](标签,属性,父母,孩子)

问题是javascript可以保留树中节点的引用,并且它可以改变(添加子节点,修改属性)它有引用的任何节点,以及遍历它的父节点。

修改

我意识到你需要以某种方式使用可变状态 - 因为你可以保留对从树中删除或在树中移动的节点的引用。如果您通过基于树结构的内容引用元素,则此引用将无效。

2 个答案:

答案 0 :(得分:1)

javascript使用可变引用操作是很自然的,所以你迟早要引入它们(不一定是IORef s,也许某种查找表存在于状态monad中。)

如果DOM上的大多数操作都是从javascript执行的,那么最好为它选择自然的数据结构。

不要仅仅为纯度本身使用纯数据结构。否则你将完成RAM的手工仿真:)你的任务看起来对我来说势在必行,那么为什么不使用haskell提供的所有命令功能呢?

我认为拉链不像Niklas B.建议的那样可以为你提供很多帮助。通常他们只有一个“光标”,您可以在其中进行变异。 (理论上AFAIK可以使用任意数量的光标,但实际上它几乎无法使用)

答案 1 :(得分:1)

通常的Haskell方法是使用不可变树,并使addChild等操作返回一个新的修改树,而不是触及现有树。

我不知道你用这棵树实际尝试做什么,我建议这可能是最简单,最简单的方法。