1

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

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

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

编辑:

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

4

2 回答 2

1

通常的 Haskell 方法是使用不可变的树,并让诸如此类的操作addChild返回一个新的、修改过的树,而不是触及现有的树。

在不知道你实际上想用这棵树做什么的情况下,我建议这可能是最简单和最简单的方法。

于 2013-02-12T08:56:25.013 回答
1

javascript 使用可变引用进行操作是很自然的,因此您迟早必须引入它们(不一定IORef是 s,也许是某种位于状态 monad 中的查找表)。

如果对 DOM 的大部分操作都将通过 javascript 执行,那么最好选择自然的数据结构。

不要试图仅仅为了纯度本身而使用纯数据结构。否则,您将完成手工制作的 RAM 仿真 :) 您的任务对我来说是必不可少的,那么为什么不使用 haskell 提供的所有命令式功能呢?

正如 Niklas B. 建议的那样,我不认为拉链对你有很大帮助。通常它们只有一个“光标”,您可以在其中进行变异。(AFAIK 理论上任何数量的游标都是可能的,但实际上它几乎不可用)

于 2013-02-12T02:30:11.670 回答