Recently fui presentato a this OCaml code che a Haskell può essere scritta come:funzionale lista doppiamente collegata pura "True" e la condivisione di nodi
data DL a = DL [a] a [a]
create [] = error "empty list"
create (x:xs) = DL [] x xs
next (DL pr x (h:tl)) = DL (x:pr) h tl
next _ = error "end of dlist"
prev (DL (p:pr) x tl) = DL pr p (x:tl)
prev _ = error "start of dlist"
che mi era non una vera e propria lista doppiamente collegata implementazione, in quanto crea nuovo storage su attraversamento. OTOH c'è this Haskell code:
data DList a = Leaf | Node { prev::(DList a), elt::a, next::(DList a) }
create = go Leaf
where go _ [] = Leaf
go prev (x:xs) = current
where current = Node prev x next
next = go current xs
Possiamo dire che si tratta solo di questo codice che è vero dl-list?
Possiamo fare affidamento su questo codice per introdurre la vera condivisione dei nodi della lista dl, in modo che non venga creato alcun nuovo spazio di archiviazione durante la traversata?
è lo stesso nome variabile in Haskell sempre riferendosi al la stessa "cosa" o potrebbe separare le occorrenze dello stesso nome variabile riferimento alla copia separata della stessa cosa? (modificato per aggiungere enfasi).
La prima implementazione è ciò che è noto come _Zipper_; probabilmente può essere per liste singole o doppie. Tuttavia, non è un'implementazione di lista a sé stante. – ivanm
Se si legge attentamente il report Haskell, non è possibile trovare un singolo paragrafo sul modo in cui i dati sono rappresentati. Tieni presente che tutti i tipi di condivisione dipendono dall'implementazione, anche se per la maggior parte sono disponibili solo pochi modi per implementare determinate funzionalità. – fuz
Grazie per questa domanda! Non sono soddisfatto con il mio, guardando per questo. – demi