It turns out that defining Read is somewhat tricky to do for a GADT. <br><br>Gershom Bazerman has some very nice slides on how to survive the process by manual typechecking (much in the spirit of Oleg&#39;s meta-typechecking code referenced by Stephen&#39;s follow up below)<br>
<br>He presented them at hac-phi this time around.<br><br>I will check with him to see if I can get permission to host them somewhere and post a link to them here.<br><br>-Edward Kmett<br><br><div class="gmail_quote">On Fri, Jun 25, 2010 at 5:04 AM,  <span dir="ltr">&lt;<a href="mailto:corentin.dupont@ext.mpsa.com">corentin.dupont@ext.mpsa.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><br>
Hello Haskellers,<br>
<br>
I&#39;m having trouble writing a Read Instance for my GATD.<br>
Arg this GATD!! It causes me more problems that it solves ;)<br>
Especially with no automatic deriving, it adds a lot of burden to my code.<br>
<br>
&gt;data Obs a where<br>
&gt;    ProposedBy :: Obs Int       -- The player that proposed the tested<br>
rule<br>
&gt;    Turn       :: Obs Turn      -- The current turn<br>
&gt;    Official   :: Obs Bool      -- whereas the tested rule is official<br>
&gt;    Equ        :: (Eq a, Show a, Typeable a) =&gt; Obs a -&gt; Obs a -&gt; Obs Bool<br>
&gt;    Plus       :: (Num a) =&gt; Obs a -&gt; Obs a -&gt; Obs a<br>
&gt;    Time       :: (Num a) =&gt; Obs a -&gt; Obs a -&gt; Obs a<br>
&gt;    Minus      :: (Num a) =&gt; Obs a -&gt; Obs a -&gt; Obs a<br>
&gt;    And        :: Obs Bool -&gt; Obs Bool -&gt; Obs Bool<br>
&gt;    Or         :: Obs Bool -&gt; Obs Bool -&gt; Obs Bool<br>
&gt;    Not        :: Obs Bool -&gt; Obs Bool<br>
&gt;    Konst      :: a -&gt; Obs a<br>
<br>
<br>
&gt; instance Read a =&gt; Read (Obs a) where<br>
&gt; readPrec = (prec 10 $ do<br>
&gt;        Ident &quot;ProposedBy&quot; &lt;- lexP<br>
&gt;        return (ProposedBy))<br>
&gt;     +++<br>
&gt;      (prec 10 $ do<br>
&gt;        Ident &quot;Official&quot; &lt;- lexP<br>
&gt;        return (Official))<br>
&gt;  (etc...)<br>
<br>
Observable.lhs:120:8:<br>
    Couldn&#39;t match expected type `Int&#39; against inferred type `Bool&#39;<br>
      Expected type: ReadPrec (Obs Int)<br>
      Inferred type: ReadPrec (Obs Bool)<br>
<br>
<br>
Indeed &quot;ProposedBy&quot; does not have the same type that &quot;Official&quot;.<br>
Mmh how to make it all gently mix altogether?<br>
<br>
<br>
Best,<br>
Corentin<br>
<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">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>
</blockquote></div><br>