Recently me presentaron a this OCaml code que, en Haskell se puede escribir como:lista funcional pura "Verdadero" doblemente enlazada y recursos compartidos de nodos
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"
la que yo estaba, aunque no una lista doblemente enlazada adecuada implementación, ya que crea un nuevo almacenamiento en el cruce. Otoh hay 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
Podemos decir que es solamente el código eso es cierto dl-lista?
¿Podemos confiar en este código para introducir el intercambio real de los nodos de la lista dl, de modo que no se cree un nuevo almacenamiento en el recorrido?
¿Está el mismo nombre variable en Haskell haciendo siempre referencia a la misma "cosa" o podría separar las ocurrencias del mismo nombre variable de referencia a copia separada de la misma cosa? (editado para agregar énfasis).
La primera implementación es lo que se conoce como _Zipper_; podría decirse que puede ser para listas vinculadas individualmente o doblemente. Sin embargo, no se trata de una implementación de listas por derecho propio. – ivanm
Si lee el informe de Haskell con cuidado, no puede encontrar un solo párrafo sobre cómo se representan los datos. Tenga en cuenta que todo tipo de intercambio depende de la implementación, aunque en su mayoría solo existen algunas formas sensatas de implementar una determinada función. – fuz
¡Gracias por esta pregunta! No he satisfecho con mi, esperando esto. – demi