edit: обычно я экспериментирую с ghci, чтобы понять новый код, поэтому для таких, как я, я создал Запись/страница School of Haskell, которая содержит приведенные ниже примеры, но их можно редактировать и запускать.
Думаю, что эти примеры ответят на ваши вопросы, но для целесообразности я собираюсь изменить другой узел. Мои знания о функциях молнии в линзе довольно поверхностны. На чтение и привыкание к типам в пакете lens требуется немного больше времени, чем во многих других пакеты, но потом не плохо. Я не использовал модуль молнии или модуль дерева в упаковке объектива до этого поста.
Деревья не очень хорошо работают с show
, поэтому, если у меня будет время, я вернусь и добавлю несколько красивых распечаток, иначе, вероятно, ключом к работе в repl с этими примерами будет увидеть, что происходит.
Viewing
Если я хочу просмотреть значение первого узла, согласно пакет линз дерева, который называется корневым, то вы можете:
zipperTree & downward root & view focus
Изменение
Чтобы изменить это значение и воссоздать дерево (заархивируйте дерево):
zipperTree & downward root & focus .~ 10 & rezip
Если вы хотите двигаться вниз по ветвям, вам нужно использовать downward branches
. Вот пример, который изменяет корень первой ветки и повторно архивирует дерево:
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
person
Davorak
schedule
19.03.2013