Hi all,

{-# LANGUAGE TypeFamilies #-}
data CB = CB deriving (Show)
data CO = CO deriving (Show)
data CBParseResult = CBParseResult deriving (Show)
data COParseResult = COParseResult deriving (Show)

class ParseResult a where
    type EntityType a :: *
    toEntity :: a -> EntityType a

instance ParseResult CBParseResult where
    type EntityType CBParseResult = CB
    toEntity result = CB

instance ParseResult COParseResult where
    type EntityType COParseResult = CO
    toEntity result = CO

getParseResult :: (ParseResult r) => String -> IO r
getParseResult i = do
    if someCond
       then return CBParseResult
       else return COParseResult
           where
               someCond = null i

    Couldn't match expected type ‘r’ with actual type ‘COParseResult’
      ‘r’ is a rigid type variable bound by
          the type signature for
            getParseResult :: ParseResult r => String -> IO r
          at Parse.hs:19:19
    Relevant bindings include
      getParseResult :: String -> IO r (bound at Parse.hs:20:1)
    In the first argument of ‘return’, namely ‘COParseResult’
    In the expression: return COParseResult

What I want to express is getParseResult to be able to return any instances of ParseResult type class. But what I understand from the error is that r has been specialized to CBParseResult, but in the next expression I'm returning COParseResult. Is my understanding correct? And, How would I express what I described?

Thanks,
Marco