Haskell - Cerniere
Zippers in Haskell sono fondamentalmente puntatori che puntano a una posizione specifica di una struttura dati come un file tree.
Consideriamo a tree avere 5 elementi [45,7,55,120,56]che può essere rappresentato come un albero binario perfetto. Se voglio aggiornare l'ultimo elemento di questo elenco, devo attraversare tutti gli elementi per raggiungere l'ultimo elemento prima di aggiornarlo. Destra?
Ma cosa succederebbe se potessimo costruire il nostro albero in modo tale che un albero dell'avere N elementi è una raccolta di [(N-1),N]. Quindi, non è necessario attraversare tutto ciò che non si desidera(N-1)elementi. Possiamo aggiornare direttamente l'ennesimo elemento. Questo è esattamente il concetto di Zipper. Si concentra o punta a una posizione specifica di un albero dove possiamo aggiornare quel valore senza attraversare l'intero albero.
Nell'esempio seguente, abbiamo implementato il concetto di Zipper in a List. Allo stesso modo, si può implementare Zipper in un filetree o a file struttura dati.
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 compili ed esegui il programma sopra, produrrà il seguente output:
([2,3,4],[1])
([3,4],[2,1])
Qui ci stiamo concentrando su un elemento dell'intera stringa mentre si va avanti o si torna indietro.