Zipper データ構造は、ツリーをトラバースして現在の位置を維持したい場合に最適ですが、複数の位置を追跡したい場合はどのデータ構造を使用すればよいでしょうか?
例を挙げて説明しましょう:
- #haskell チャンネルの誰かが、yi エディターではカーソル位置を表すためにジッパーが使用されていると教えてくれました。これはすばらしいことですが、カーソルを 2 つにしたい場合はどうすればよいでしょうか。選択を表現したい場合と同様に、選択の開始と終了を知る必要があります。
- ウィキブックの Minotaur の例では、Zipper を使用して、迷宮内の Minotaur の位置を表しています。迷宮に敵を追加したい場合は、ジッパーで敵の位置を表すのが理にかなっています。
- 最後の 1 つは、すべてが始まった私のミニ プロジェクトからのものです。Haskell の学習の一環として、cairo と gth2hs を使用してツリー構造を視覚化しようとしています。ここまではうまくいきましたが、今度は 1 つまたは複数のノードを選択して、たとえば移動できるようにしたいと考えています。選択したノードが複数ある可能性があるため、教科書で定義されているように Zipper をそのまま使用することはできません。
hereで説明されているように、有限マップを含む XMonad の初期バージョンで使用されていたものと同様の、簡単な (単純な?) ソリューションがあります。
つまり、たとえば私のサンプル プロジェクトの場合、選択したノードをインデックス付きマップに格納し、メイン構造内のそれらの表現をインデックスに置き換えます。しかし、このソリューションには多くの欠点があります。上記のリンクで説明されているように、または私の例の場合、すべてのノードの選択を解除するには、ツリー全体を検索する必要があります。