
Hi, Many thanks to everyone who responded to my earlier question about hierarchies of typeclasses. I have a followup question regarding creating instances. Suppose I have this additive semigroup typeclass: class (Num a) => AddSemigroup a where (|+|) :: a -> a -> a (|+|) = (+) I'd like to make 2-element tuples instances of AddSemigroup, provided their elements are: instance (AddSemigroup a, AddSemigroup b) => AddSemigroup (a, b) GHC says it "Could not deduce (Num (a, b))" in this situation, which seems fair enough so I tried: instance (AddSemigroup a, Num a, AddSemigroup b, Num b) => AddSemigroup (a, b) With the same result. Separate instances seem to work though: instance (Num a, Num b) => Num (a, b) instance (AddSemigroup a, AddSemigroup b) => AddSemigroup (a, b) At this point I feel like I must be duplicating instances that are provided in a standard way in the prelude somewhere, or more likely I've misunderstood the ideas around creating instances? Any advice much appreciated, Stu