A Застежка-молния - это метод представления совокупной структуры данных для удобства для написания программ, которые произвольно пересекают структуру и обновляют ее содержимое, особенно в чисто функциональных языках программирования. Застежка-молния была описана Жераром Хюэ в 1997 году. Она включает и обобщает технику буфера промежутков, иногда используемую с массивами.
Застежка-молния является общей в том смысле, что ее можно адаптировать к спискам, деревьям и другим рекурсивно определенным структурам данных. Такие модифицированные структуры данных обычно упоминаются как «дерево с застежкой-молнией» или «список с застежкой-молнией», чтобы подчеркнуть, что структура концептуально является деревом или списком, а застежка-молния - это деталь реализации.
Обычный человек объяснил бы дерево с застежкой-молнией обычной компьютерной файловой системой с операциями перехода к родительскому объекту (часто cd..
) и возможностью перехода вниз (cd подкаталог
). Застежка-молния - это указатель на текущий путь. Незаметно застежки-молнии эффективны при внесении (функциональных) изменений в структуру данных, когда новая, слегка измененная структура данных возвращается из операции редактирования (вместо того, чтобы вносить изменения в текущую структуру данных).
Многие общие структуры данных в информатике могут быть выражены как структура, генерируемая несколькими примитивами или. Сюда входит структура конечных списков, которые могут быть сгенерированы двумя операциями:
Empty
создает пустой список,Cons (x, L)
создает список, добавляя или объединяя значение x
перед списком L
.Список, такой как [1, 2, 3]
, поэтому является объявлением Cons (1, Cons (2, Cons (3, Empty))))
. Можно описать местоположение в таком списке, как количество шагов от начала списка до целевого местоположения. Более формально, место в списке - это количество операций Cons
, необходимых для восстановления всего списка из этого конкретного места. Например, в Минусы (1, Минусы (2, Минусы (X, 4, Пусто))))
a Минусы (2, L)
и Минусы (1, L) операция
потребуется для восстановления списка относительно позиции X, иначе известной как Cons (X, Cons (4, Empty))
. Эта запись вместе с местоположением называется заархивированным представлением списка или застежкой-молнией списка.
Для ясности: место в списке - это не только количество операций Минусы
, но и вся другая информация об этих Минусах
; в этом случае значения, которые необходимо повторно подключить. Здесь эти значения могут быть удобно представлены в отдельном списке в порядке приложения от целевого местоположения. В частности, из контекста «3» в списке [1, 2, 3, 4]
запись (обычно называемая «путем») может быть представлена как [2, 1]
, где применяется Cons (2, L)
, за которым следует (Cons 1, L)
для восстановления исходного списка, начиная с [X, 4]
.
Застежка-молния всегда представляет всю структуру данных. Однако эта информация дана с точки зрения конкретного места в этой структуре данных. Следовательно, застежка-молния со списком - это пара, состоящая из местоположения как контекста или начальной точки и записи или пути, который позволяет реконструировать из этого начального местоположения. В частности, застежка-молния списка [1, 2, 3, 4]
в позиции "3" может быть представлена как ([2, 1], [3, 4])
. Теперь, если "3" изменить на "10", то застежка-молния списка станет ([2, 1], [10, 4])
. После этого список может быть эффективно реконструирован: [1, 2, 10, 4]
или другие местоположения, к которым был осуществлен переход.
При таком представлении списка легко определять относительно эффективные операции с неизменяемыми структурами данных, такими как списки и деревья, в произвольных местах. В частности, применение преобразования застежки-молнии к дереву позволяет легко вставлять или удалять значения в любом конкретном месте дерева.
Тип контекстов застежки-молнии может быть сконструирован с помощью преобразования исходного типа, который тесно связан с производным от исчисления до декатегоризации. Рекурсивные типы, из которых формируются застежки-молнии, можно рассматривать как наименьшую фиксированную точку конструктора унарного типа вида . Например, с конструктором типа высшего порядка , который строит наименьшую фиксированную точку его аргумент немаркированное двоичное дерево может быть представлено как и немаркированный список может принимать форму . Здесь обозначения возведения в степень, умножения и сложения соответствуют типам функций, типам продуктов и типам суммы соответственно, в то время как натуральные числа обозначают конечные типы ; Таким образом, конструкторы типов напоминают полиномиальные функции в .
Таким образом, производная конструктора типа может быть образована с помощью этой синтаксической аналогии : для примера троичного дерева без метки производная от его конструктора типа будет эквивалентно , аналогично использованию суммы и power правила дифференциального исчисления. Тип контекстов застежки-молнии над исходным типом эквивалентен производному конструктора типа, примененного к исходному типу, .
Для иллюстрации рассмотрим рекурсивную структуру данных двоичного дерева с узлами, которые являются либо контрольными узлами из введите или содержат значение типа :
Производная конструктора типа может быть вычислена как
Таким образом, тип контекстов застежки-молнии является
Таким образом, мы обнаруживаем, что контекст каждого дочернего узла, не являющегося дозорным, в метке ведомое двоичное дерево представляет собой тройку, состоящую из
В общем, застежка-молния для дерева типа состоит из двух частей: списка контекстов типа текущего узла и каждого из его предков до корневого узла и поддерево типа , который содержит текущий узел.
Застежка-молния часто используется там, где есть некоторая концепция фокуса или перемещения в некотором наборе данных, поскольку ее семантика отражает семантику перемещения, но функциональным неразрушающим способом.
Застежка-молния использовалась в
В языке программирования, не являющемся чисто функциональным, может быть удобнее просто пройти по исходной структуре данных и изменить ее напрямую (возможно, после глубокого клонирования, чтобы не повлиять на другой код, который может содержать ссылку на него).
Универсальная застежка-молния - это метод достижения той же цели, что и обычная застежка-молния, путем фиксации состояния обхода в продолжении при посещении каждого узла. (Код Haskell, приведенный в справочнике, использует универсальное программирование для генерации функции обхода для любой структуры данных, но это необязательно - может использоваться любая подходящая функция обхода.)
Однако Generic Zipper включает в себя инверсию элемента управления, поэтому для некоторых его применений требуется конечный автомат (или эквивалент), чтобы отслеживать, что делать дальше.
В Wikibook Haskell есть страница по теме: Застежки-молнии |