2013-02-12 102 views
1

我想在haskell編寫瀏覽器。中央數據結構將是代表文檔的可變樹。除了使用完全由iorefs組成的樹,還有更好的解決方案嗎?什麼haskell數據結構來存儲可變的樹

我希望能避免這樣的事情:data DomNode = DomNode TagName NodeProperties (IORef DomNode) [IORef DomNode](標籤,屬性,父母,子女)

的問題是,JavaScript可以守住節點引用的樹,它可以發生變異(添加子,修改屬性)它引用的任何節點,以及遍歷它的父節點。

編輯:

我意識到你將需要以某種方式使用可變的狀態 - 因爲你可以穩守於從樹中刪除,或者在樹上移動的節點的引用。如果你通過基於樹結構的東西來引用元素,那麼這個引用將是無效的。

+2

也許使用[拉鍊](http://www.haskell.org/haskellwiki/Zipper)? – 2013-02-12 01:49:40

回答

1

對於JavaScript來說,使用可變引用是很自然的,所以你必須遲早介紹它們(不一定是IORef s,也許某種查詢表生活在monad狀態)。

如果DOM上的大部分操作都是從javascript執行的,那麼最好選擇自然的數據結構。

不要嘗試僅將純數據結構用於純度本身。否則,你會完成手工製作RAM的模擬:)你的任務看起來勢在必行,那麼爲什麼不使用haskell提供的所有命令功能呢?

我不認爲拉鍊,正如Niklas B.所建議的,可以幫助你很多。通常他們只有一個「光標」,在那裏你可以進行變異。 (AFAIK理論上任何數量的遊標都是可能的,但實際上它大多是不可用的)

+0

實際上,Store comonad可以非常優雅地處理多個索引。您只需要將遊標類型添加到每個索引 – 2013-02-12 11:58:21

+0

@GabrielGonzalez的產品中就知道了。你能指點我一些相關的閱讀嗎? (最好是像我這樣的類別理論假人:)) – Yuras 2013-02-12 12:08:20

+0

還沒有。儘管如此,我正在撰寫一篇關於comonads的博客文章,這就是爲什麼這個話題在我的腦海裏變得新鮮。 – 2013-02-12 12:22:56

1

通常的Haskell方法是使用不可變樹,並且有諸如addChild之類的操作返回一個新的,修改過的樹,而不是觸摸現有的樹。

不知道你真的想要與這棵樹,我會建議這可能是最簡單和最簡單的方法。

相關問題