Ответ 1
edit: Я обычно экспериментирую в ghci, чтобы понять новый код, поэтому для таких, как я, я создал School of Haskell post/page, который приходит с приведенными ниже примерами, но они доступны для редактирования и запуска.
Подумайте, что эти примеры ответят на ваши вопросы, но для целесообразности я собираюсь изменить другой node. Мои знания о функциях застежки-молнии в lens довольно мелкий. Это займет немного больше времени, чтобы читать и привыкать к типам в lens по сравнению со многими другими пакетами, но потом это неплохо. Я не использовал модуль молнии или модуль дерева в пакете объектива перед этим сообщением.
Деревья не очень хорошо сочетаются с show
, поэтому, если у меня будет время, я вернусь и добавлю довольно красивую распечатку, иначе это, вероятно, ключ к работе в repl с этими примерами, чтобы увидеть, что происходит.
Просмотр
Если я хочу просмотреть значение первого node, в соответствии с пакетом дерева для дерева, это называется корнем, то вы можете:
zipperTree & downward root & view focus
Изменение
Чтобы изменить это значение и воссоздать дерево (rezip дерево):
zipperTree & downward root & focus .~ 10 & rezip
Если вы хотите переместиться вниз по веткам, вам нужно использовать downward branches
. Вот пример, который изменяет корень первой ветки и rezipx дерево:
zipperTree & downward branches
& fromWithin traverse
& downward root
& focus .~ 5
& rezip
Здесь я перехожу вниз в список ветвей. Затем я использую fromWithin
use use traverse
для перемещения по списку, если это был кортеж, я мог бы использовать both
вместо этого.
Сохранение и воспроизведение дорожек обхода
saveTape
и restoreTape
позволяют сохранить позицию на молнии, чтобы ее можно было восстановить последним.
Сохранить позицию:
tape = zipperTree & downward branches
& fromWithin traverse
& downward root
& saveTape
Затем, чтобы воссоздать обход через дерево, я могу:
t <- (restoreTape tape testTree)
Затем вы можете использовать t в качестве новой молнии и изменить ее как обычно:
t & focus .~ 15 & rezip
Лента повторяет шаги, которые вы сделали, поэтому может работать на других деревьях, поэтому последующие действия будут работать с лентой, как определено выше:
testTree2 = Node 1 [ Node 2 [] ]
t2 <- (restoreTape tape testTree2)
t2 & focus .~ 25 & rezip
Изменение нескольких местоположений
Если вы хотите изменить несколько корней, просто удерживайте их при изменении размера молнии. Ниже перечислены два корня testTree2:
zipper testTree2 & downward root
& focus .~ 11
& upward
& downward branches
& fromWithin traverse
& downward root
& focus .~ 111
& rezip