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



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

我希望避免这样的事情:data DomNode = DomNode TagName NodeProperties (IORef DomNode) [IORef DomNode](标记、属性、父级、子级)

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

编辑:

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

javascript使用可变引用操作是很自然的,所以您迟早要引入它们(不一定是IORefs,可能是某种生活在状态monad中的查找表)。

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

不要试图使用纯粹的数据结构只是为了纯粹本身。否则,您将以手工模拟RAM结束:)对我来说,您的任务看起来是必要的,那么为什么不使用haskell提供的所有必要功能呢?

我不认为拉链能像Niklas B.建议的那样对你有很大帮助。通常它们只有一个"光标",你可以在那里变异。(AFAIK理论上任何数量的游标都是可能的,但在实践中它大多不可用)

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

在不知道您实际想用这棵树做什么的情况下,我认为这可能是最简单、最容易的方法。

最新更新