I have type classes, for all of which I would like to have some common behavior. My problem is explained in the following code:
class A a
class B b
class X x where
method :: (A a, B b) => x -> a -> b
data T = L | M | N
data U = P | Q | R
instance A T
instance B U
data Y = ZZZ
instance X Y where
method _ L = P
method _ M = Q
method _ N = R
When I load this module, I get the following error:
example.hs:19:14:
Could not deduce (a ~ T)
from the context (A a, B b)
bound by the type signature for method :: (A a, B b) => Y -> a -> b
at example.hs:(17,5)-(19,18)
`a' is a rigid type variable bound by
the type signature for method :: (A a, B b) => Y -> a -> b
at example.hs:17:5
In the pattern: N
In an equation for `method': method _ N = R
In the instance declaration for `X Y'
example.hs:19:18:
Could not deduce (b ~ U)
from the context (A a, B b)
bound by the type signature for method :: (A a, B b) => Y -> a -> b
at example.hs:(17,5)-(19,18)
`b' is a rigid type variable bound by
the type signature for method :: (A a, B b) => Y -> a -> b
at example.hs:17:5
In the expression: R
In an equation for `method': method _ N = R
In the instance declaration for `X Y'
Failed, modules loaded: none.
I am at loss what to do in this case. Even when T and U are instance of A and B, I get this error. If I cannot return a rigid type value from method, how do I code this part?