Moreover, copying is not even meaningful in a functional setting.  A data structure is indistinguishable from a copy of the data structure.  In languages that allow mutation of data, one has to carefully copy data to avoid accidental mutation by other computations.  Disallow data mutation, and the problem disappears.<br>

<br>  - Conal<br><br><div class="gmail_quote">On Wed, Jun 17, 2009 at 7:44 AM, Jake McArthur <span dir="ltr">&lt;<a href="mailto:jake.mcarthur@gmail.com">jake.mcarthur@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

<div class="im">Rouan van Dalen wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
It is important to store only a reference to the parent and not a copy of the entire parent for efficiency.<br>
</blockquote>
<br></div>
Others have already recommended the rosezipper package, which gives you what you want, but I want to address one thing.<br>
<br>
    foo = &lt;stuff&gt;<br>
    bar = foo<br>
<br>
In most implementations (including GHC, which I assume you are using), `bar` will *not* be an actual copy of `foo`. In fact, GHC will not make a deep copy of a structure unless you pattern match all the way down and reconstruct it all the way back up yourself.<br>


<br>
If you use a zipper, like Data.Tree.Zipper mentioned already, moving around will not create and destroy tons of data. It will only create and destroy the spine of the tree local to the current &quot;pointer&quot; into the tree, which is not a lot of data. If you are holding on to older versions of the zipper, of course, they won&#39;t even be destroyed.<br>

<font color="#888888">
<br>
- Jake</font><div><div></div><div class="h5"><br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</div></div></blockquote></div><br>