我在考虑在haskell中编写浏览器。中央数据结构将是表示文档的可变树。除了使用完全由iorefs组成的树之外,还有更好的解决方案吗?
我希望避免这样的事情:data DomNode = DomNode TagName NodeProperties (IORef DomNode) [IORef DomNode]
(标签,属性,父母,孩子)
问题是javascript可以保留树中节点的引用,并且它可以改变(添加子节点,修改属性)它有引用的任何节点,以及遍历它的父节点。
修改
我意识到你需要以某种方式使用可变状态 - 因为你可以保留对从树中删除或在树中移动的节点的引用。如果您通过基于树结构的内容引用元素,则此引用将无效。
答案 0 :(得分:1)
javascript使用可变引用操作是很自然的,所以你迟早要引入它们(不一定是IORef
s,也许某种查找表存在于状态monad中。)
如果DOM上的大多数操作都是从javascript执行的,那么最好为它选择自然的数据结构。
不要仅仅为纯度本身使用纯数据结构。否则你将完成RAM的手工仿真:)你的任务看起来对我来说势在必行,那么为什么不使用haskell提供的所有命令功能呢?
我认为拉链不像Niklas B.建议的那样可以为你提供很多帮助。通常他们只有一个“光标”,您可以在其中进行变异。 (理论上AFAIK可以使用任意数量的光标,但实际上它几乎无法使用)
答案 1 :(得分:1)
通常的Haskell方法是使用不可变树,并使addChild
等操作返回一个新的修改树,而不是触及现有树。
我不知道你用这棵树实际尝试做什么,我建议这可能是最简单,最简单的方法。