24

Zipper データ構造は、ツリーをトラバースして現在の位置を維持したい場合に最適ですが、複数の位置を追跡したい場合はどのデータ構造を使用すればよいでしょうか?

例を挙げて説明しましょう:

  • #haskell チャンネルの誰かが、yi エディターではカーソル位置を表すためにジッパーが使用されていると教えてくれました。これはすばらしいことですが、カーソルを 2 つにしたい場合はどうすればよいでしょうか。選択を表現したい場合と同様に、選択の開始と終了を知る必要があります。
  • ウィキブックの Minotaur の例では、Zipper を使用して、迷宮内の Minotaur の位置を表しています。迷宮に敵を追加したい場合は、ジッパーで敵の位置を表すのが理にかなっています。
  • 最後の 1 つは、すべてが始まった私のミニ プロジェクトからのものです。Haskell の学習の一環として、cairo と gth2hs を使用してツリー構造を視覚化しようとしています。ここまではうまくいきましたが、今度は 1 つまたは複数のノードを選択して、たとえば移動できるようにしたいと考えています。選択したノードが複数ある可能性があるため、教科書で定義されているように Zipper をそのまま使用することはできません。

hereで説明されているように、有限マップを含む XMonad の初期バージョンで使用されていたものと同様の、簡単な (単純な?) ソリューションがあります。

つまり、たとえば私のサンプル プロジェクトの場合、選択したノードをインデックス付きマップに格納し、メイン構造内のそれらの表現をインデックスに置き換えます。しかし、このソリューションには多くの欠点があります。上記のリンクで説明されているように、または私の例の場合、すべてのノードの選択を解除するには、ツリー全体を検索する必要があります。

4

2 に答える 2

13

区切られた継続による「並行」ジッパーに関する Oleg の研究が主な参考資料です。

于 2010-08-09T00:00:52.230 に答える
10

この論文を参照してください。二次導関数には 2 つの穴があることをどこかで読んだことを思い出したようです。これはおそらくあなたが望むものです。

于 2010-08-10T18:52:15.270 に答える