Ispirato alla recente domanda sulle griglie 2D in Haskell, mi chiedo se sarebbe possibile creare una cerniera bidimensionale per tenere traccia di una posizione in un elenco di elenchi. Una cerniera unidimensionale in un elenco ci consente di spostarci in modo efficiente localmente in un elenco di grandi dimensioni (l'esempio comune è un editor di testo). Ma supponiamo di avere una seconda dimensione del genere:Zipper bidimensionale
grid =
[[ 1, 2, 3, 4, 5]
,[ 6, 7, 8, 9,10]
,[11,12,13,14,15]
,[16,17,18,19,20]
,[21,22,23,24,25]]
Possiamo creare una sorta di struttura dati cerniera a muoversi in modo efficiente non solo a destra ea sinistra, ma su e giù nella griglia qui? In tal caso, cosa succede se sostituiamo la lista delle liste con una lista infinita di liste infinite, possiamo ancora ottenere movimento efficiente?
"Uno degli aspetti chiave di come cerniere lavoro è che essi rappresentano una posizione in una struttura da un percorso utilizzato per raggiungerla". Perché avere un percorso unico è un requisito fondamentale per le chiusure lampo?Avrei pensato che qualsiasi modo per rappresentare una "posizione" in una struttura dati sarebbe sufficiente –
@AnupamJain: Poiché i frammenti usati per ricostruire sono pezzi della struttura originale e immutabile, se uno di questi contiene un altro percorso per la "stessa" posizione, quando lo si riassembla quel percorso avrà ancora il valore originale. L'unico modo per gestirlo è percorrere entrambi i percorsi e fare entrambe le sostituzioni, cioè considerando entrambi i percorsi come il percorso "unico". –
@AnupamJain: più percorsi ridondanti sono possibili, maggiore è l'inefficienza che si crea. Lo scenario peggiore è qualcosa di simile a una lista ciclica, in cui vi è un numero infinito di percorsi e ogni percorso contiene l'intera struttura, che ti costringe a ricostruire tutto. –