<div dir="ltr"><font color="#003333"><font size="2"><font face="trebuchet ms,sans-serif">Cool. I wasn&#39;t aware of that notation.  It doesn&#39;t quite get to the issue though.</font></font></font><div><font color="#003333"><font size="2"><font face="trebuchet ms,sans-serif"><br>

</font></font></font></div><div><font color="#003333"><font size="2"><font face="trebuchet ms,sans-serif">The problem I&#39;m concerned about is the need to define y in the first place. If one is chasing through a data structure and finds a need to change something buried within it, it seems necessary to rebuild everything that includes the changed thing.  That is, I can&#39;t change a component of somethingNew without creating y. The point is there&#39;s nothing about x that changed, and there may be nothing about (var1 x) that changed, and there may be nothing about var11 . var1 $ x that changed, etc. Yet one is apparently forced to keep track of and reconstruct all those elements. </font></font></font></div>

<div><font color="#003333"><font size="2"><font face="trebuchet ms,sans-serif"><br></font></font></font></div><div><font color="#003333"><font size="2"><font face="trebuchet ms,sans-serif">Another example is to imagine a Tree in which the leaves contain &quot;objects.&quot;  If I want to change a property of one of those leaf objects, I am forced to rebuild all the ancestor nodes of that leaf down to rebuilding the root.</font></font></font></div>

<div><font color="#003333"><font size="2"><font face="trebuchet ms,sans-serif"><br></font></font></font></div><div><font color="#003333"><font size="2"><font face="trebuchet ms,sans-serif">One way to avoid that is for the leaves to refer to their objects through a Map. Then changing a leaf object requires only that the value associated with key represented by the leaf be (re-)inserted into the Map.  The Tree itself need not change at all.  </font></font></font></div>

<div><font color="#003333"><font size="2"><font face="trebuchet ms,sans-serif"><br></font></font></font></div><div><font color="#003333"><font size="2"><font face="trebuchet ms,sans-serif">But that trick isn&#39;t always available.  In the example we are talking about we can&#39;t make a Map where they keys are the instance variable names and the values are their values.  That would seem to do the job, but since the values are of different types, we can&#39;t create such a Map.</font></font></font></div>

<div><font color="#003333"><font size="2"><font face="trebuchet ms,sans-serif"><br></font></font></font></div><div><font color="#003333"><font size="2"><font face="trebuchet ms,sans-serif">So now what?<br clear="all"></font></font></font><div dir="ltr">

<font><font face="&#39;trebuchet ms&#39;, sans-serif"><i><font color="#003333"><br>-- Russ </font></i></font></font></div><br>
<br><br><div class="gmail_quote">On Wed, Nov 24, 2010 at 12:26 PM, Daniel Fischer <span dir="ltr">&lt;<a href="mailto:daniel.is.fischer@web.de">daniel.is.fischer@web.de</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div><div></div><div class="h5">On Wednesday 24 November 2010 20:40:02, Russ Abbott wrote:<br>
&gt; I would appreciate some advice about the best way to manipulate data<br>
&gt; structures in Haskell.<br>
&gt;<br>
&gt; Let&#39;s assume I have what in an OO language would be a class with a<br>
&gt; number of instance variables.  When I want to change one of the values<br>
&gt; of one of those instance variables in Haskell I must rebuild the entire<br>
&gt; structure.  Even worse, if one of those instance variables is a<br>
&gt; reference to another data structure, then when I change that referenced<br>
&gt; data structure, I am forced to rebuild my top level variable.  For<br>
&gt; example.<br>
&gt;<br>
&gt; data Struct1  =  Struct1  {var1  :: Struct11, var2 :: Struct1, ... }<br>
&gt; data Struct11 = Struct11 {var11 :: ... }<br>
&gt;<br>
&gt; Let&#39;s assume I have x :: Struct1 and that I change the value of var11 .<br>
&gt; var1 $ x.  Doesn&#39;t that require that I rebuild x?<br>
<br>
</div></div>No, x doesn&#39;t change.<br>
What you probably mean is<br>
<br>
y = x{ var1 = (var1 x){ var11 = somethingNew } }<br>
<br>
Then y shares all fields except var1 with x, the var1 field of y must be<br>
built, but it shares everything except the var11 field with (var1 x).<br>
<br>
Since values are immutable, the bulk of the structure is shared between an<br>
original value and a modified one (except if the structures are very small<br>
so there&#39;s little to share, but then building is cheap, or the modification<br>
changes very much of the structure, but then the modification would be<br>
expensive also in a language with mutable values).<br>
<div class="im"><br>
&gt;<br>
&gt; Is there a better way?<br>
&gt;<br>
&gt; Thanks.<br>
&gt; *<br>
</div>&gt; -- Russ*<br>
<br>
</blockquote></div><br></div></div>