So I have a data type
data SomeType a =
Type a |
Mix (SomeType a) (SomeType a)
This my show instance for SomeType
Here's an example based on the documentation which should be able to parse everything that show renders (assuming the type has a compatible Read instance defined), that is read . show should be more or less the identity:
instance (Read a) => Read (SomeType a) where
readsPrec d r = readMix r ++ readType r
where
readMix = readParen True $ \r -> do
(v1, r'') <- readsPrec d r
(v2, r') <- readsPrec d r''
return (Mix v1 v2, r')
readType r = do
(v, r') <- readsPrec d r
return (Type v, r')
Thus,
> read "(3 4)" :: SomeType Int
(3 4)
it :: SomeType Int
But note, that for SomeType Char the default Show instance of Char surrounds the character with single quotes:
> read "('a' ('b' 'c'))" :: SomeType Char
('a' ('b' 'c'))
it :: SomeType Char
hope this helps