Haskell - Zamki błyskawiczne

Zippers w Haskell są w zasadzie wskaźnikami wskazującymi na określoną lokalizację struktury danych, takiej jak plik tree.

Rozważmy a tree posiadające 5 elementów [45,7,55,120,56]które można przedstawić jako doskonałe drzewo binarne. Jeśli chcę zaktualizować ostatni element tej listy, muszę przejść przez wszystkie elementy, aby dotrzeć do ostatniego elementu, zanim go zaktualizuję. Dobrze?

Ale co by było, gdybyśmy mogli zbudować nasze drzewo w taki sposób, że drzewo posiadania N elementy to zbiór [(N-1),N]. Wtedy nie musimy przechodzić przez wszystkie niechciane(N-1)elementy. Możemy bezpośrednio zaktualizować N-ty element. To jest dokładnie koncepcja Zippera. Skupia się lub wskazuje na określone położenie drzewa, w którym możemy zaktualizować tę wartość bez przechodzenia przez całe drzewo.

W poniższym przykładzie zaimplementowaliśmy koncepcję Zippera na liście. W ten sam sposób można zaimplementować Zipper w plikutree lub a file struktura danych.

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

Kiedy kompilujesz i uruchamiasz powyższy program, wygeneruje on następujące dane wyjściowe -

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

Tutaj skupiamy się na elemencie całej struny podczas jazdy do przodu lub do tyłu.