質問

問題は単純です:私はジッパーのデータ構造を理解することはできません。

私の質問は、ツリーとその使用に関連しています。

私はジッパーを使用してツリーノードを変更する方法を理解したいです。そして、どのようにしませツリー全体(またはその大部分)をコピーします。

私はジッパーと間違っている場合は、明確にしてください。多分それは、ツリーの更新を助けることができない?
または、多分、それはツリーを更新することが可能であると私は道を見ることができない?

役に立ちましたか?

解決

のは、リストのジッパーアナログから始めましょう。あなたは、リストのn番目の要素を変更したい場合は、n-1最初の要素をコピーする必要があるため、それはO(n)をとります。代わりに、構造((最初のn-1の要素は逆)n番目の要素(残りの要素))のようなリストを維持することができます。例えば、3で変更リスト(1 2 3 4 5 6)((2 1) 3 (4 5 6))として表されることになります。さて、あなたは簡単に他の何かに3を変更することができます。また、簡単に焦点左((1) 2 (3 4 5 6))と右((3 2 1) 4 (5 6))を移動することができます。

ジッパーが樹木に適用されたものと同じ考えです。あなたはそれが焦点に簡単に変更可能だし、それがフォーカスを上下に移動するのは簡単だ形であなたのツリー全体を与え、ツリー内の特定の焦点プラス(子供まで両親まで、)コンテキストを表します。

他のヒント

ここでは非常に素晴らしい記事が説明している<のhref = "https://donsbot.wordpress.com/2007/05/17/roll-your-own-window-manager-tracking-focus-with-a-zipper /」のrel = 『nofollowをnoreferrer』> Haskellのの中にタイル型ウィンドウマネージャのためのジッパーを使用。 Wikipediaの記事は良い参考ではありません。

要するに、ジッパーはポインタであるか、または木またはリスト構造内の特定のノードへのハンドル。ジッパーは、ツリー構造を取って、木は集中ノードで「拾った」たかのようにそれを治療する自然な方法を提供します - 実際には、あなたは、元の木で作られた追加のコピーを必要とするか、他のユーザーに影響を与えることなく、第二の木を取得しますツリーます。

の例は、最初に画面上の位置によってソートされたウィンドウを持っているかのショーを与え、その後、あなたがフォーカスウィンドウに向けジッパーを使用注力モデル化します。あなたはOの素敵なセットなど、インサートとして(1)の操作を取得し、特殊なケースにフォーカスウィンドウをせずに削除したり、追加のコードを記述します。

Haskellはまた、ジッパーについて 素晴らしい章を持っているあなたを学びます。

この記事のは、Haskellのに関係しているが、それはまた、かなりよくジッパーを説明し、それはHaskellの-仕様から抽象的に簡単にする必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top