Haskell - Cremalleras

Zippers en Haskell son básicamente punteros que apuntan a una ubicación específica de una estructura de datos, como un tree.

Consideremos un tree tener 5 elementos [45,7,55,120,56]que se puede representar como un árbol binario perfecto. Si quiero actualizar el último elemento de esta lista, entonces necesito recorrer todos los elementos para llegar al último elemento antes de actualizarlo. ¿Correcto?

Pero, ¿y si pudiéramos construir nuestro árbol de tal manera que un árbol de tener N elementos es una colección de [(N-1),N]. Entonces, no necesitamos atravesar todos los(N-1)elementos. Podemos actualizar directamente el elemento Nth. Este es exactamente el concepto de Zipper. Se enfoca o apunta a una ubicación específica de un árbol donde podemos actualizar ese valor sin atravesar todo el árbol.

En el siguiente ejemplo, hemos implementado el concepto de cremallera en una lista. De la misma manera, se puede implementar Zipper en untree o un file estructura de datos.

data List a = Empty | Cons a (List a) deriving (Show, Read, Eq, Ord)
type Zipper_List a = ([a],[a])    

go_Forward :: Zipper_List a -> Zipper_List a   
go_Forward (x:xs, bs) = (xs, x:bs)   
   
go_Back :: Zipper_List a -> Zipper_List a   
go_Back (xs, b:bs) = (b:xs, bs)    

main = do 
   let list_Ex = [1,2,3,4] 
   print(go_Forward (list_Ex,[]))       
   print(go_Back([4],[3,2,1]))

Cuando compile y ejecute el programa anterior, producirá la siguiente salida:

([2,3,4],[1]) 
([3,4],[2,1])

Aquí nos centramos en un elemento de toda la cadena mientras avanzamos o retrocedemos.