1

私はhaskellでブラウザを書くことを考えていました。中心的なデータ構造は、ドキュメントを表す可変ツリーになります。完全にiorefで構成されるツリーを使用する以外に、より良い解決策はありますか?

私はこのようなものを避けたいと思っています:(data DomNode = DomNode TagName NodeProperties (IORef DomNode) [IORef DomNode]タグ、プロパティ、親、子)

問題は、javascriptがツリー内のノードの参照を保持でき、参照先のノードを変更(子の追加、プロパティの変更)したり、親に移動したりできることです。

編集:

ツリーから削除された、またはツリー内で移動されたノードへの参照を保持できるため、何らかの方法で可変状態を使用する必要があることに気付きました。ツリーの構造に基づいたものを介して要素を参照した場合、この参照は無効になります。

4

2 に答える 2

1

javascriptが可変参照で動作するのは自然なことなので、遅かれ早かれそれらを導入する必要があります(必ずしもIORefsではなく、州のモナドにあるある種のルックアップテーブルかもしれません)。

DOMに対するほとんどの操作がjavascriptから実行される場合は、それに自然なデータ構造を選択することをお勧めします。

純粋なデータ構造を純粋さ自体のためだけに使用しようとしないでください。そうでなければ、RAMの手作りエミュレーションで終了します:)あなたのタスクは私にとって必須のように見えるので、haskellが提供するすべての必須機能を使用しないのはなぜですか?

Niklas B.が提案したように、ジッパーが大いに役立つとは思いません。通常、それらには、変更できる「カーソル」が1つだけあります。(理論的には任意の数のカーソルが可能ですが、実際にはほとんど使用できません)

于 2013-02-12T02:30:11.670 に答える
1

通常のHaskellのアプローチは、不変のツリーを使用しaddChild、既存のツリーに触れるのではなく、などの操作で新しい変更されたツリーを返すようにすることです。

このツリーで実際に何をしようとしているのかわからない場合は、これがおそらく最も単純で簡単なアプローチであることをお勧めします。

于 2013-02-12T08:56:25.013 に答える