<div dir="ltr">Hi all,<div><div><font face="monospace, monospace"><br></font></div><div><div><font face="monospace, monospace">{-# LANGUAGE TypeFamilies #-}</font></div><div><font face="monospace, monospace">data CB = CB deriving (Show)</font></div><div><font face="monospace, monospace">data CO = CO deriving (Show)</font></div><div><font face="monospace, monospace">data CBParseResult = CBParseResult deriving (Show)</font></div><div><font face="monospace, monospace">data COParseResult = COParseResult deriving (Show)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">class ParseResult a where</font></div><div><font face="monospace, monospace">    type EntityType a :: *</font></div><div><font face="monospace, monospace">    toEntity :: a -> EntityType a</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">instance ParseResult CBParseResult where</font></div><div><font face="monospace, monospace">    type EntityType CBParseResult = CB</font></div><div><font face="monospace, monospace">    toEntity result = CB</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">instance ParseResult COParseResult where</font></div><div><font face="monospace, monospace">    type EntityType COParseResult = CO</font></div><div><font face="monospace, monospace">    toEntity result = CO</font></div><div><font face="monospace, monospace"><br></font></div><div><div><font face="monospace, monospace">getParseResult :: (ParseResult r) => String -> IO r</font></div><div><font face="monospace, monospace">getParseResult i = do</font></div><div><font face="monospace, monospace">    if someCond</font></div><div><font face="monospace, monospace">       then return CBParseResult</font></div><div><font face="monospace, monospace">       else return COParseResult</font></div><div><font face="monospace, monospace">           where</font></div><div><font face="monospace, monospace">               someCond = null i</font></div></div></div><div><br></div><div><div><font face="arial, helvetica, sans-serif">    Couldn't match expected type ‘r’ with actual type ‘COParseResult’</font></div><div><font face="arial, helvetica, sans-serif">      ‘r’ is a rigid type variable bound by</font></div><div><font face="arial, helvetica, sans-serif">          the type signature for</font></div><div><font face="arial, helvetica, sans-serif">            getParseResult :: ParseResult r => String -> IO r</font></div><div><font face="arial, helvetica, sans-serif">          at Parse.hs:19:19</font></div><div><font face="arial, helvetica, sans-serif">    Relevant bindings include</font></div><div><font face="arial, helvetica, sans-serif">      getParseResult :: String -> IO r (bound at Parse.hs:20:1)</font></div><div><font face="arial, helvetica, sans-serif">    In the first argument of ‘return’, namely ‘COParseResult’</font></div><div><font face="arial, helvetica, sans-serif">    In the expression: return COParseResult</font></div></div><div><br></div><div>What I want to express is <font face="monospace, monospace">getParseResult</font> to be able to return any instances of <font face="monospace, monospace">ParseResult</font> type class. But what I understand from the error is that <font face="monospace, monospace">r</font> has been specialized to <font face="monospace, monospace">CBParseResult</font><font face="arial, helvetica, sans-serif">, but in the next expression I'm returning </font><font face="monospace, monospace">COParseResult</font><font face="arial, helvetica, sans-serif">. Is my understanding correct? And, How would I express what I described?</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">Thanks,</font></div><div><font face="arial, helvetica, sans-serif">Marco</font></div></div></div>