Deriving Generic1 for a type containing Either
With the following code:
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics
data T a = C (Either Int a) deriving Generic1
I get the error message:
Main.hs:3:38:
Can't make a derived instance of `Generic1 T':
must not apply type constructors that cannot be represented with `Rep1'
(such as `Either') to arguments that involve the last type parameter
In the data declaration for `T'
But when I look at the instances of Generic1
, I see the following (summarized):
*Main> :i Generic1
...
instance Generic1 (Either a) -- Defined in `GHC.Generics'
...
So, it seems that Either a
can be represented with Rep1
. Consequently, the error message is a bit confusing.
Similarly, I can define my own version of Either
-- e.g. data U a b = A a | B b deriving Generic1
-- replace Either
with U
and still get the message. I also get this problem using U
as data U a b = U a b deriving Generic1
but not with T
as data T a = C (Int, a) deriving Generic1
.
Lastly, I try this:
data T a = C (Either Int (T a)) deriving Generic1
but the error is even stranger here:
Main.hs:3:38:
Can't make a derived instance of `Generic1 T':
must not apply type constructors that cannot be represented with `Rep1'
(such as `T') to arguments that involve the last type parameter
In the data declaration for `T'
What's the general problem with these examples?
- Can the error message be improved?
- Can the deriving mechanism be extended for these types?
I'm assuming I can write my own Generic1
instance, though I haven't actually tried.
Trac metadata
Trac field | Value |
---|---|
Version | 7.6.1 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |