
On Mon, Jul 09, 2007 at 04:28:43PM +0100, Claus Reinke wrote:
which is the important hint! the parser used for 'read' depends on the return type, but the existential type _hides_ the internal type which would be needed to select a read parser.
I think that this is precisely what I wasn't getting. If I understand it correctly, this also means that what I supposed to be my smart trick is actually dumbly useless - the "Read e" here: forall e . (MyClass e, Show e, Read e) => MT (e,Int)
if your hidden types have distinguishable 'show'-representations, you could write your own typecase like this (making use of the fact that 'read' parsers with incorrect type will fail, and that the internal type can be hidden after parsing)
readMT :: ReadPrec MyType readMT = prec 10 $ do Ident "MT" <- lexP parens $ (do { m <- readPrec; return (MT (m::(TipoA,Int))) }) `mplus` (do { m <- readPrec; return (MT (m::(TipoB,Int))) })
*Test> read (show [MT (T1a,1),MT (T1b,3)]) :: [MyType] [MT (T1a,1),MT (T1b,3)]
(if necessary, you could have 'show' embed a type representation for the hidden type, and dispatch on that representation in 'read')
The problem is that I was trying to find a way to define the class (MyClass) and not writing a parser for every possible type (or even using their show-representation): I wanted a polymorphic list of types over which I could use the method defined for their class, but, as far as I can get it, this is not possible. Thanks for your kind attention. All the best, Andrea