<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7653.38">
<TITLE>RE: [Haskell-cafe] Simple Table Update</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->

<P><FONT SIZE=2>It brings tears to my eyes to see such a beautiful function ;) You've hit the nail on the head Ryan. The new version of my second previous code snippet now no longer requires &quot;fixpu*&quot;, and is:<BR>
<BR>
typeCheckAST (Program pus) = Program $ snd $ mapAccumL f [] pus<BR>
<BR>
&nbsp; where f st pu = (st ++ [(&quot;&quot;,[])],pu)<BR>
<BR>
Many thanks,<BR>
Paul<BR>
<BR>
-----Original Message-----<BR>
From: Ryan Ingram [<A HREF="mailto:ryani.spam@gmail.com">mailto:ryani.spam@gmail.com</A>]<BR>
Sent: Wed 08/10/2008 18:03<BR>
To: Paul Keir<BR>
Cc: haskell-cafe@haskell.org<BR>
Subject: Re: [Haskell-cafe] Simple Table Update<BR>
<BR>
Prelude&gt; :t Data.List.mapAccumL<BR>
Data.List.mapAccumL :: (acc -&gt; x -&gt; (acc, y)) -&gt; acc -&gt; [x] -&gt; (acc, [y])<BR>
<BR>
I'm sure you can fill in the details :)<BR>
<BR>
&nbsp; -- ryan<BR>
<BR>
2008/10/8 Paul Keir &lt;pkeir@dcs.gla.ac.uk&gt;:<BR>
&gt; Hi,<BR>
&gt;<BR>
&gt; I'd like to create a new list based on an original list, using information<BR>
&gt; from a second (symbol) list. That second list should be updated as each<BR>
&gt; element in the new list is added. I've been using map a lot, but that's not<BR>
&gt; an option here, and I'm having trouble obtaining a good recursive structure<BR>
&gt; for my function.<BR>
&gt;<BR>
&gt; The minimal &quot;fixpus&quot; function below shows the problem. I have &quot;sts&quot; on both<BR>
&gt; sides of the &quot;:&quot; list construct, but I'd like the second &quot;sts&quot; to be a<BR>
&gt; version modified by the where (singular) function, &quot;fixpu&quot;.<BR>
&gt;<BR>
&gt; fixpus :: [ProgUnit] -&gt; [ProgUnitSymbolTable] -&gt; [ProgUnit]<BR>
&gt; fixpus []&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _&nbsp; = []<BR>
&gt; fixpus (pu:pus) sts = fixpu pu sts : fixpus pus sts<BR>
&gt;<BR>
&gt;&nbsp;&nbsp; where fixpu pu sts = pu<BR>
&gt;<BR>
&gt; (Below) I tried making &quot;fixpu&quot; return a tuple, and then use &quot;fst&quot;, &quot;snd&quot; and<BR>
&gt; &quot;let&quot;, but I think it looks strange. I know it's quite basic, but I'd like a<BR>
&gt; strong foundation for what's likely to become a medium-scale project. Can<BR>
&gt; anyone offer advice?<BR>
&gt;<BR>
&gt; fixpus :: [ProgUnit] -&gt; [ProgUnitSymbolTable] -&gt; [ProgUnit]<BR>
&gt; fixpus []&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _&nbsp; = []<BR>
&gt; fixpus (pu:pus) sts = let a = (fixpu pu sts) in fst a : fixpus pus (snd a)<BR>
&gt;<BR>
&gt;&nbsp;&nbsp; where fixpu pu sts = (pu,sts ++ [(&quot;&quot;,[])])<BR>
&gt;<BR>
&gt; Regards,<BR>
&gt; Paul<BR>
&gt;<BR>
&gt;<BR>
&gt; _______________________________________________<BR>
&gt; Haskell-Cafe mailing list<BR>
&gt; Haskell-Cafe@haskell.org<BR>
&gt; <A HREF="http://www.haskell.org/mailman/listinfo/haskell-cafe">http://www.haskell.org/mailman/listinfo/haskell-cafe</A><BR>
&gt;<BR>
&gt;<BR>
<BR>
</FONT>
</P>

</BODY>
</HTML>