Hi,<br><br>I'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 -> Int -> Int -> IO Engine<br>
createEngine name major minor = do<br> tUsers <- newTVarIO []<br> return $ Engine<br> { engineName = name<br> , version = EngineVersion<br> { major = major<br> , minor = minor<br> }<br>
, users = tUsers<br> }<br><br>class TShow a where<br> tshow :: a -> IO String<br><br>instance Show (TVar a) where<br> show a = "%"<br><br>instance (Show a) => TShow a where<br> tshow a = return $ show a<br>
<br>instance (Show a) => TShow (TVar a) where<br> tshow ta = do<br> a <- atomically (readTVar ta)<br> return $ show a<br><br>data User = User<br> { userName :: String<br> }<br> deriving Show<br><br>
data EngineVersion = EngineVersion<br> { major :: Int<br> , minor :: Int<br> }<br> deriving Show<br><br>data Engine = Engine<br> { engineName :: String<br> , version :: EngineVersion<br> , users :: TVar [User]<br>
}<br><br>instance TShow Engine where<br> tshow a = do<br> users <- atomically (readTVar (users a))<br> return $<br> "Engine { " ++<br> "engineName = " ++ show (engineName a) ++ ", " ++<br>
"version = " ++ show (version a) ++ ", " ++<br> "users = %" ++ show users ++ " }"<br><br>When I run it however, I get this:<br><br>*Main> te <- createEngine "Hello" 1 2<br>
*Main> s <- tshow te<br><br><interactive>:1:5:<br> Overlapping instances for TShow Engine<br> arising from a use of `tshow' at <interactive>:1:5-12<br> Matching instances:<br> instance (Show a) => TShow a -- Defined at fxmain.hs:(26,0)-(27,27)<br>
instance TShow Engine -- Defined at fxmain.hs:(51,0)-(58,41)<br> In a stmt of a 'do' expression: s <- tshow te<br><br>I'm not seeing how instance (Show a) => TShow a in the above error message is applicable here since Engine is not an instance of Show. Why is it complaining?<br>
<br>Thanks,<br><br>-John<br><br>