Структура данных Zipper хороша, когда нужно пройтись по дереву и сохранить текущую позицию, но какую структуру данных следует использовать, если они хотят отслеживать более одной позиции?
Позвольте мне объяснить с примерами:
-
Кто-то на канале #haskell сказал мне, что в редакторе yi используются молнии для представления
положение курсора. Это здорово, но что, если вы хотите иметь два
курсоры. Например, если вы хотите представить выборку, вам нужно знать начало и
конец выбора.
-
В примере Минотавра на вики-книгах они используют Застежку-молнию для представления положения Минотавра внутри лабиринта. Если бы я хотел добавить противника в лабиринт, то представлять его положение с помощью молнии было бы как нельзя лучше.
-
Последний из моего мини-проекта, с которого все началось: как часть изучения Haskell, я пытаюсь визуализировать древовидную структуру, используя cairo и gth2hs. Пока все прошло хорошо, но сейчас я бы хотел выбрать один или несколько узлов и иметь возможность, например, переместить их. Поскольку может быть более одного из выбранных узлов, я не могу просто использовать
Молния, как это определено в учебниках.
Существует тривиальное (наивное?) Решение, подобное тому, которое они использовали в ранних версиях XMonad, которое включает в себя конечные карты, как объяснено здесь .
То есть, например, в случае моего примера проекта я бы сохранил выбранные узлы в индексированной карте и заменил их представление в основной структуре индексами. Но это решение имеет множество недостатков. Как и те, которые описаны в ссылке выше, или, скажем, снова в случае моего примера, отмена выбора всех узлов потребует поиска по всему дереву.