StandaloneDeriving on Read fails for GADTs
Consider the following code that derives a Read instance for a GADT datatype:
data Foo a where
Foo :: Show a => a -> Foo a
deriving instance Show (Foo a)
The above code works correctly. However, changing the "Show" constraint to "Read" will cause GHC to fail:
data Foo a where
Foo :: Read a => a -> Foo a
deriving instance Read (Foo a)
with the error message:
No instance for (Read a)
arising from a use of `GHC.Read.readPrec'
In the first argument of `Text.ParserCombinators.ReadPrec.step', namely
`GHC.Read.readPrec'
In a stmt of a 'do' block:
a1 <- Text.ParserCombinators.ReadPrec.step GHC.Read.readPrec
In the second argument of `Text.ParserCombinators.ReadPrec.prec', namely
`do { Text.Read.Lex.Ident "Foo" <- GHC.Read.lexP;
a1 <- Text.ParserCombinators.ReadPrec.step GHC.Read.readPrec;
return (Foo a1) }'
When typechecking the code for `GHC.Read.readPrec'
in a standalone derived instance for `Read (Foo a)':
To see the code I am typechecking, use -ddump-deriv
A workaround is to place an additional Read constraint on the deriving clause:
data Foo a where
Foo :: Read a => a -> Foo a
deriving instance Read a => Read (Foo a)
Trac metadata
Trac field | Value |
---|---|
Version | 7.6.2 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |