cwbe coordinatez:
101
63540
2076399
3671716
3672097

ABSOLUT
KYBERIA
permissions
you: r,
system: public
net: yes

neurons

stats|by_visit|by_K
source
tiamat
commanders
polls

total descendants::
total children::0
show[ 2 | 3] flat


Nedávno som narazil na zaujímavú dátovú štruktúru používanú v neprocedurálnych jazykoch: Zipper. Existujú údajne univerzálne zippre, zatiaľ som pochopil len stromové.

Špecifikom zippra je možnosť držať si akýsi "kurzor" v strome, umožňuje v strome označiť pozíciu, pričom je možné odovzdávať celý strom aj s kurzorom ako parameter funkcii alebo ho vrátiť, proste používa sa ako normálna hodnota.

Podstatou celého kúzla je to, že strom sa obracia "naruby" — neuchopíme ho totiž za koreň, ako obvykle, ale za vrchol, na ktorom máme kurzor. Na to však, pochopiteľne, musíme pozmeniť použité dátové štruktúry. V uchopenom vrchole potrebujeme mať okrem podstromu pod ním uložené informácie o nadstrome nad ním — o ceste ku koreňu a vetvách z nej sa vetviacich. Kurzor vo vrchole takto rozdeľuje strom na dve časti, na podstrom a nadstrom.

Naprogramovať potom prechádzanie kurzorom po strome je jednoduché -- vždy sa aktuálny podstrom a nadstrom zlepia do nového stromu, aby sa tento znova rozdelil na inej (vedľajšej) pozícii. Odtiaľ názov Zipper, pripomína to fungovanie zipsu.

Celá teória okolo toho je zjavne dosť rozsiahla, siaha až po algebraické derivovanie *morfizmov na množinách, relatívne zrozumiteľne je to vysvetlené v Haskellovskej wiki, potom je tu aj nekonvenčne pojatá Wikibook o zipperi a na výklad skúpa, na linky však menej, stránka o zipperi na Wikipedii.

Zipper sa používa napríklad v okennom manažéri XMonad a v ZipperFS.