複数のカーソルを備えたジッパーのようなデータ構造
質問
Zipper データ構造は、ツリーをトラバースして現在の位置を維持したい場合には最適ですが、複数の位置を追跡したい場合はどのようなデータ構造を使用すればよいでしょうか?
例を挙げて説明しましょう:
- #haskell チャンネルの誰かが、yiエディタではジッパーが表現に使われていると教えてくれました。 カーソル位置。これは素晴らしいことですが、2つ持ちたい場合はどうでしょうか カーソル。選択範囲を表現したい場合と同様に、先頭と 選択範囲の最後。
- ウィキブックのミノタウロスの例では、迷宮内のミノタウロスの位置を表すためにジッパーが使用されています。迷宮に敵を追加したい場合は、敵の位置をジッパーで表すことも同様に理にかなっています。
- 最後の 1 つは、実際にすべてが始まった私のミニ プロジェクトからのものです。Haskell の学習の一環として、cairo と gth2hs を使用してツリー構造を視覚化しようとしています。ここまではうまくいきましたが、今度は 1 つ以上のノードを選択して、たとえば次のことをできるようにしたいと思います。それらを移動させます。選択したノードが複数存在する可能性があるため、単に使用することはできません 教科書で定義されているジッパー。
XMonadの初期バージョンで使用されていたものと同様の、説明したように有限マップを含む自明な(単純な?)解決策があります。 ここ.
つまり、例えば私のサンプル プロジェクトの場合、選択したノードをインデックス付きマップに保存し、メイン構造内のノードの表現をインデックスで置き換えます。しかし、この解決策には多くの欠点があります。上のリンクで説明したものと同様、または私の例の場合、すべてのノードの選択を解除するには、ツリー全体を検索する必要があります。
解決
オレグさんの取り組み 区切り文字で区切られた継続による「同時」ジッパー が主な参考資料です。
他のヒント
見る この紙 . 。二次導関数には穴が 2 つあるということをどこかで読んだような気がします。おそらくそれがあなたが望んでいることでしょう。
所属していません StackOverflow