Ah, I found the attachment on your other email.<div><br></div><div>I would recommend using the Fix and Ann types, instead of the AnnFix type.</div><div><br></div><div>I modified your code a bit (and fixed the Show instances etc...) and put it here:</div>
<div><a href="http://hpaste.org/fastcgi/hpaste.fcgi/view?id=27823#a27823">http://hpaste.org/fastcgi/hpaste.fcgi/view?id=27823#a27823</a></div><div><br></div><div>Let me know if you have questions about it.</div><div><br></div>
<div>- Job</div><div><a href="http://hpaste.org/fastcgi/hpaste.fcgi/view?id=27823#a27823"></a><br><br><div class="gmail_quote">2010/7/19 Job Vranish <span dir="ltr">&lt;<a href="mailto:job.vranish@gmail.com">job.vranish@gmail.com</a>&gt;</span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">I didn&#39;t get any attachments from you, but haskell-cafe might filter them out (I&#39;m not sure).<br><br>But, the usual derived instances for Show should work fine for your expression and annotation types. <br>
For the Fix type you can use:<br>
<br>instance (Show (f (Fix f))) =&gt; Show (Fix f) where<br>† show (Fix a) = show &quot;Fix &quot; ++ show a<br><br>hmmm, but you&#39;ll probably need:<br><br>{-# LANGUAGE FlexibleContexts, UndecidableInstances #-}<br><font color="#888888"><br>

<br>- Job</font><div><div></div><div class="h5"><br><br><br><div class="gmail_quote">2010/7/19 Josť Romildo Malaquias <span dir="ltr">&lt;<a href="mailto:j.romildo@gmail.com" target="_blank">j.romildo@gmail.com</a>&gt;</span><br>
<blockquote class="gmail_quote" style="border-left:1px solid rgb(204, 204, 204);margin:0pt 0pt 0pt 0.8ex;padding-left:1ex">
<div>On Mon, Jul 19, 2010 at 01:51:57PM -0400, Job Vranish wrote:<br>
&gt; Martijn van Steenbergen has a good blog post that describes the method I<br>
&gt; generally use:<br>
&gt; <a href="http://martijn.van.steenbergen.nl/journal/2010/06/24/generically-adding-position-information-to-a-datatype/" target="_blank">http://martijn.van.steenbergen.nl/journal/2010/06/24/generically-adding-position-information-to-a-datatype/</a><br>


&gt;<br>
&gt; In his example he annotates the expression tree with position information,<br>
&gt; but you can use the same method to add type annotations, or whatever you<br>
&gt; want.<br>
<br>
</div>After a quick read at Martijn blog article I&#39;ve written the attached<br>
test program, which works.<br>
<br>
But I am not succeeding in deriving Show for the data types. Any help?<br>
<font color="#888888"><br>
Romildo<br>
</font><div><div></div><div><br>
&gt; 2010/7/19 Josť Romildo Malaquias &lt;<a href="mailto:j.romildo@gmail.com" target="_blank">j.romildo@gmail.com</a>&gt;<br>
&gt;<br>
&gt; &gt; Hello.<br>
&gt; &gt;<br>
&gt; &gt; In his book &quot;Modern Compilder Implementation in ML&quot;, Appel presents a<br>
&gt; &gt; compiler project for the Tiger programming language where type checking<br>
&gt; &gt; and intermediate code generation are intrinsically coupled.<br>
&gt; &gt;<br>
&gt; &gt; There is a function<br>
&gt; &gt;<br>
&gt; &gt; †transExp :: Absyn.Exp -&gt; (Tree.Exp,Types.Type)<br>
&gt; &gt;<br>
&gt; &gt; that do semantic analysis, translating an expression to the Tree<br>
&gt; &gt; intermediate representation language and also do type checking,<br>
&gt; &gt; calculating the type of the expression.<br>
&gt; &gt;<br>
&gt; &gt; Maybe the compiler can be made more didatic if these phases are separate<br>
&gt; &gt; phases of compilation.<br>
&gt; &gt;<br>
&gt; &gt; The type checker would annotate the abstract syntax tree (ast) with type<br>
&gt; &gt; annotations, that could be used later by the translater to intermediate<br>
&gt; &gt; representation.<br>
&gt; &gt;<br>
&gt; &gt; In an imperative language probably each relevant ast node would have a<br>
&gt; &gt; field for the type annotation, and the type checker would assign the<br>
&gt; &gt; type of the node to this field after computing it.<br>
&gt; &gt;<br>
&gt; &gt; I am writing here to ask suggestions on how to annotate an ast with<br>
&gt; &gt; types (or any other information that would be relevant in a compiler<br>
&gt; &gt; phase) in Haskell.<br>
&gt; &gt;<br>
&gt; &gt; As an example, consider the simplified ast types:<br>
&gt; &gt;<br>
&gt; &gt; †data Exp<br>
&gt; &gt; † †= IntExp Integer<br>
&gt; &gt; † †| VarExp Symbol<br>
&gt; &gt; † †| AssignExp Symbol Exp<br>
&gt; &gt; † †| IfExp Exp Exp (Maybe Exp)<br>
&gt; &gt; † †| CallExp Symbol [Exp]<br>
&gt; &gt; † †| LetExp [Dec] Exp<br>
&gt; &gt;<br>
&gt; &gt; †data Dec<br>
&gt; &gt; † † = TypeDec Symbol Ty<br>
&gt; &gt; † † | FunctionDec Symbol [(Symbol,Symbol)] (Mybe Symbol) Exp<br>
&gt; &gt; † † | VarDec Symbol (Maybe Symbol) Exp<br>
&gt; &gt;<br>
&gt; &gt; Expressions can have type annotations, but declarations can not.<br>
&gt; &gt;<br>
&gt; &gt; Comments?<br>
</div></div></blockquote></div><br>
</div></div></blockquote></div><br></div>