Hi,<br><br>I&#39;ve got the following code which tries to implement a TShow class, which is equivalent to Show, except it is supposed to work on TVar types as well.<br><br>import GHC.Conc<br><br>createEngine :: String -&gt; Int -&gt; Int -&gt; IO Engine<br>
createEngine name major minor = do<br>&nbsp;&nbsp; tUsers &lt;- newTVarIO []<br>&nbsp;&nbsp; return $ Engine<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { engineName = name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , version = EngineVersion<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { major = major<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , minor = minor<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , users = tUsers<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>class TShow a where<br>&nbsp;&nbsp; tshow :: a -&gt; IO String<br><br>instance Show (TVar a) where<br>&nbsp;&nbsp; show a = &quot;%&quot;<br><br>instance (Show a) =&gt; TShow a where<br>&nbsp;&nbsp; tshow a = return $ show a<br>
<br>instance (Show a) =&gt; TShow (TVar a) where<br>&nbsp;&nbsp; tshow ta = do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a &lt;- atomically (readTVar ta)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $ show a<br><br>data User = User<br>&nbsp;&nbsp; { userName :: String<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; deriving Show<br><br>
data EngineVersion = EngineVersion<br>&nbsp;&nbsp; { major :: Int<br>&nbsp;&nbsp; , minor :: Int<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; deriving Show<br><br>data Engine = Engine<br>&nbsp;&nbsp; { engineName :: String<br>&nbsp;&nbsp; , version :: EngineVersion<br>&nbsp;&nbsp; , users :: TVar [User]<br>
&nbsp;&nbsp; }<br><br>instance TShow Engine where<br>&nbsp;&nbsp; tshow a = do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; users &lt;- atomically (readTVar (users a))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Engine { &quot; ++<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;engineName = &quot; ++ show (engineName a) ++ &quot;, &quot; ++<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;version = &quot; ++ show (version a) ++ &quot;, &quot; ++<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;users = %&quot; ++ show users ++ &quot; }&quot;<br><br>When I run it however, I get this:<br><br>*Main&gt; te &lt;- createEngine &quot;Hello&quot; 1 2<br>
*Main&gt; s &lt;- tshow te<br><br>&lt;interactive&gt;:1:5:<br>&nbsp;&nbsp;&nbsp; Overlapping instances for TShow Engine<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arising from a use of `tshow&#39; at &lt;interactive&gt;:1:5-12<br>&nbsp;&nbsp;&nbsp; Matching instances:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; instance (Show a) =&gt; TShow a -- Defined at fxmain.hs:(26,0)-(27,27)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; instance TShow Engine -- Defined at fxmain.hs:(51,0)-(58,41)<br>&nbsp;&nbsp;&nbsp; In a stmt of a &#39;do&#39; expression: s &lt;- tshow te<br><br>I&#39;m not seeing how instance (Show a) =&gt; TShow a in the above error message is applicable here since Engine is not an instance of Show.&nbsp; Why is it complaining?<br>
<br>Thanks,<br><br>-John<br><br>