[Haskell-cafe] Re: Updating doubly linked lists

Apfelmus, Heinrich apfelmus at quantentunnel.de
Thu Jan 1 05:03:56 EST 2009


S. Günther wrote:
> Untying the knot was (and still is) exactly the problem I was facing.
> I knew that the whole list had to be rebuild and wasn't concerned
> with performance since at that point I just wanted to know how to
> do it and if it is possible at all. After I realized that it maybe just to
> hard in the circular case I tried my hand on a non circular version
> coming up with the following.
>
> data DList a =
>   DLNode {left::(DList a), value::a, right::(DList a)} |
>   Leaf

Whether circular or not, sharing values by using a "back pointer" is
problematic for any update. Why not use a zipper instead?

    data Zipper a = Zip [a] a [a]

    value :: Zipper a -> a
    value (Zip _ x _) = x

    right, left :: Zipper a -> Zipper a
    left  (Zip (l:ls) x rs) = Zip ls l (x:rs)
    right (Zip ls x (r:rs)) = Zip (x:ls) r rs

    update :: Zipper a -> a -> Zipper a
    update (Zip ls _ rs) x = Zip ls x rs

In other words, you don't have to implement  left  and  right  as record
labels, implementing them as normal functions may be better.


For more about zippers, see also

   http://en.wikibooks.org/wiki/Haskell/Zippers

There are also some ready-made packages on hackage, like  ListZipper .


Regards,
H. Apfelmus



More information about the Haskell-Cafe mailing list