Начнем с Zipper-аналога для списков. Если вы хотите изменить n-й элемент списка, для этого потребуется O (n), потому что вы должны скопировать n-1 первых элементов. Вместо этого вы можете сохранить список как структуру ((первые n-1 элементы обращены), n-й элемент (оставшиеся элементы)). Например, список (1 2 3 4 5 6)
, изменяемый на 3, будет представлен как ((2 1) 3 (4 5 6))
. Теперь вы можете легко изменить 3 на что-то другое. Вы также можете легко перемещать фокус влево ((1) 2 (3 4 5 6))
и вправо ((3 2 1) 4 (5 6))
.
Молния - это та же идея, что и деревья. Вы представляете определенный фокус в дереве плюс контекст (вплоть до родителей, вплоть до детей), который дает вам все дерево в форме, где его легко изменить в фокусе и легко перемещать фокус вверх и вниз.