Help with expressing polymorphic return type

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
participants (1)
-
Marco Yuen