Thanks all, it works fine (see below). <br><br>I lamentably try to make the same for show:<br>&gt; showTypeable :: (Typeable a) =&gt; a -&gt; String
<br>&gt; showTypeable x = case cast x of<br>&gt;                      Just x&#39; -&gt; show x&#39;<br>&gt;                      Nothing -&gt; &quot;&quot;
<br><br>Because it really upsets me to add this show constraints to the Equ constructor ;)<br>what if i want to make an Obs instance with non showable elements, with no intention to show it of course? <br><br>Corentin<br>
<br>
&gt; instance Typeable1 Obs where
<br>
&gt;    typeOf1 _ = mkTyConApp (mkTyCon &quot;Obs&quot;) []
<br>
 <br>
&gt; (===) :: (Typeable a, Typeable b, Eq b) =&gt; a -&gt; b -&gt; Bool
<br>
&gt; (===) x y = cast x == Just y
<br> 
<br><br>&gt; data Obs a where
<br>&gt;     Player   :: Obs Player  <br>&gt;     Official :: Obs Bool<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    :: (Show a, Eq a) =&gt; a -&gt; Obs a
<br> <br> <br> <br>&gt; instance Show t =&gt; Show (Obs t) where
<br>&gt;     show Player      = &quot;Player&quot;
<br>&gt;     show Official    = &quot;Official&quot;
<br>&gt;     show (Equ a b)   = (show a) ++ &quot; Eq &quot; ++ (show b)
<br>&gt;     show (Plus a b)  = (show a) ++ &quot; Plus &quot; ++ (show b)
<br>&gt;     show (Minus a b) = (show a) ++ &quot; Minus &quot; ++ (show b)
<br>&gt;     show (Time a b)  = (show a) ++ &quot; Time &quot; ++ (show b)
<br>&gt;     show (Konst a)   = &quot; (Konst &quot; ++ (show a) ++ &quot;)&quot;
<br>&gt;     show (And a b)   = (show a) ++ &quot; And &quot; ++ (show b)
<br>&gt;     show (Or a b)    = (show a) ++ &quot; Or &quot; ++ (show b)
<br>&gt;     show (Not a)     = &quot; (Not &quot; ++ (show a) ++ &quot;)&quot;
<br> <br> <br>&gt; instance Eq t =&gt; Eq (Obs t) where
<br>&gt;     Player == Player       = True
<br>&gt;     Official == Official   = True
<br>&gt;     Equ a b == Equ c d     = (a,b) === (c,d)     <br>&gt;     Plus a b == Plus c d   = (a == c) &amp;&amp; (b == d)
<br>&gt;     Minus a b == Minus c d = (a == c) &amp;&amp; (b == d)
<br>&gt;     Time a b == Time c d   = (a == c) &amp;&amp; (b == d)
<br>&gt;     And a b == And c d     = (a == c) &amp;&amp; (b == d)
<br>&gt;     Or a b == Or c d       = (a == c) &amp;&amp; (b == d)
<br>&gt;     Not a == Not b         = (a == b)
<br>&gt;     Konst a == Konst b     = a == b
<br>&gt;     _ == _                 = False
<br><br>