Zipper как структура данных с более чем одним курсором

структура данных молнии велика, когда вы хотите пересечь дерево и сохранить текущую позицию, но какую структуру данных следует использовать, если они хотят отслеживать более одной позиции?

поясню на примерах:

  • Кто-то на канале #haskell сказал мне, что молнии используются в Редакторе yi для представления позиция курсора. Это здорово, но что, если вы хотите иметь два указатели. Например, если вы хотите представить выборку, вам нужно знаете, начало и конец отбора.
  • В Примере Минотавра на wikibooks они используют Zipper для представления положения Минотавра внутри лабиринта. Если бы я хотел добавить врага в лабиринт, представление их положения с помощью молнии имело бы такой же смысл.
  • Последний на самом деле из моего мини-проекта, где все началось: в рамках обучения Haskell я пытаюсь визуализировать древовидную структуру, используя cairo и gth2hs. До сих пор все шло хорошо, но теперь ... Я хотел бы выбрать один или несколько узлов и иметь возможность, например, перемещать их. Потому что может быть несколько выбранных узлов, которые я не могу просто использовать застежка-молния, как определено в учебниках.

есть тривиальный (наивный?) решение, подобное тому, которое они использовали в ранних версиях XMonad, которое включает конечные карты, как объяснено здесь.

то есть, например, в случае моего примера проекта, я бы сохранил выбранные узлы в индексированном сопоставьте и замените их представление в основной структуре индексами. Но у этого решения много недостатков. Как и те, что описаны в ссылке выше, или, скажем, снова в случае моего примера, для отмены выбора всех узлов потребуется поиск по всему дереву.

2 ответов



посмотреть этой статье . Кажется, я где-то читал, что вторая производная имеет два отверстия, что, вероятно, и нужно.