Haskell - Zíperes

Zippers em Haskell são basicamente ponteiros que apontam para algum local específico de uma estrutura de dados, como um tree.

Vamos considerar um tree tendo 5 elementos [45,7,55,120,56]que pode ser representada como uma árvore binária perfeita. Se eu quiser atualizar o último elemento desta lista, preciso percorrer todos os elementos para chegar ao último elemento antes de atualizá-lo. Certo?

Mas, e se pudéssemos construir nossa árvore de tal maneira que uma árvore de ter N elementos é uma coleção de [(N-1),N]. Então, não precisamos atravessar todos os indesejáveis(N-1)elementos Podemos atualizar diretamente o enésimo elemento. Este é exatamente o conceito do Zipper. Ele se concentra ou aponta para um local específico de uma árvore onde podemos atualizar esse valor sem percorrer toda a árvore.

No exemplo a seguir, implementamos o conceito de Zipper em uma Lista. Da mesma forma, pode-se implementar o Zipper em umtree ou um file estrutura de dados.

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]))

Quando você compila e executa o programa acima, ele irá produzir a seguinte saída -

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

Aqui, estamos nos concentrando em um elemento de toda a corda, enquanto avançamos ou voltamos.