どのようなジッパーのデータ構造であり、私はそれを使用すべきですか?
-
22-08-2019 - |
質問
問題は単純です:私はジッパーのデータ構造を理解することはできません。。 P>
私の質問は、ツリーとその使用に関連しています。
私はジッパーを使用してツリーノードを変更する方法を理解したいです。そして、どのようにしませツリー全体(またはその大部分)をコピーします。
私はジッパーと間違っている場合は、明確にしてください。多分それは、ツリーの更新を助けることができない?
または、多分、それはツリーを更新することが可能であると私は道を見ることができない?
解決
のは、リストのジッパーアナログから始めましょう。あなたは、リストの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の-仕様から抽象的に簡単にする必要があります。