<br><br><div class="gmail_quote">On Thu, Jun 10, 2010 at 11:14 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="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im">On Thursday 10 June 2010 22:01:38, Dupont Corentin wrote:<br>
&gt; Hello Maciej,<br>
&gt; i tried this out, but it didn&#39;t worked.<br>
&gt;<br>
&gt; Daniel,<br>
&gt;<br>
&gt; I added a (Show a) constraint to Equal:<br>
&gt; &gt; data Obs a where<br>
&gt; &gt;     Player :: Obs Integer<br>
&gt; &gt;     Turn :: Obs Integer<br>
&gt; &gt;     Official :: Obs Bool<br>
&gt; &gt;     Equ :: (Show a, Eq a) =&gt; Obs a -&gt; Obs a -&gt; Obs Bool<br>
&gt;<br>
&gt; --woops!!<br>
&gt;<br>
&gt; &gt;     Plus :: (Num a) =&gt; Obs a -&gt; Obs a -&gt; Obs a<br>
&gt; &gt;     Time :: (Num a) =&gt; Obs a -&gt; Obs a -&gt; Obs a<br>
&gt; &gt;     Minus :: (Num a) =&gt; Obs a -&gt; Obs a -&gt; Obs a<br>
&gt; &gt;     Konst :: a -&gt; Obs a<br>
&gt; &gt;     And :: Obs Bool -&gt; Obs Bool -&gt; Obs Bool<br>
&gt; &gt;     Or :: Obs Bool -&gt; Obs Bool -&gt; Obs Bool<br>
&gt;<br>
&gt; It works for the Show instance, but not Eq.<br>
&gt; By the way, shouldn&#39;t the Show constraint be on the instance and not on<br>
&gt; the datatype declaration?<br>
<br>
</div>Can&#39;t be here, because of<br>
<div class="im">  Equ :: Obs a -&gt; Obs a -&gt; Obs Bool<br>
<br>
</div>You forget the parameter a, and you can&#39;t recover it in the instance<br>
declaration. So you have to provide the Show instance for a on<br>
construction, i.e. put the constraint on the data constructor.<br>
<div class="im"><br></div></blockquote><div><br>Anyway, is my Obs construction revelant at all? What i want to do is to provide an EDSL to the user to test things about the state of the game (for the Nomic game i&#39;m making). Obs will be then embedded in another EDSL to construct Nomic&#39;s rules.<br>
<br> </div><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">
&gt; I&#39;d prefer to keep the datatype as generic as possible...<br>
&gt;<br>
&gt; There is really no way to make my Obs datatype an instance of Eq and<br>
&gt; Show??<br>
<br>
</div>Show can work (should with the constraint on Equ), Eq is hairy.<br>
<div class="im"><br>
instance Show t =&gt; Show (Obs t) where<br>
</div>    show (Equ a b) = show a ++ &quot; `Equal` &quot; ++ show b<br>
    show (Plus a b) = ...<br>
    show (Konst x) = &quot;Konst &quot; ++ show x<br>
    ...<br>
<br>
For an Eq instance, you have the problem that<br>
<br>
Equ (Konst True) (Konst False)<br>
and<br>
Equ Player Turn<br>
<br>
both have the type Obs Bool, but have been constructed from different<br>
types, so you can&#39;t compare (Konst True) and Player.<br>
I don&#39;t see a nice way to work around that.<br>
<div><div></div><div class="h5"><br></div></div></blockquote><div><br>These is a dirty way: compare the string representation of the rules. They should be unique.<br> </div></div>Corentin<br>