
Sure, it can certainly be done: class CombineLines a b where (++) :: a -> b -> Lines instance CombineLines Line Line where { ... } instance CombineLines Line Lines where { ... } instance CombineLines Lines Line where { ... } instance CombineLines Lines Lines where { ... } Of course, whether or not such a class is an especially useful thing is another matter entirely. Other encodings might be more helpful in practice. Perhaps something like this is closer to what you really want: class ToLines a where toLines :: a -> Lines instance ToLines Line where toLines = lineToLines instance ToLines Lines where toLines = id (++) :: (ToLines a, ToLines b) => a -> b -> Lines x ++ y = toLines x `addLines` toLines y Or perhaps none of these are really all that helpful in practice, and the overloading isn’t really worth it.
On Jun 12, 2018, at 22:58, Hilco Wijbenga
wrote: Hi all,
Given definitions of Line and Lines is it possible to define a type class (or maybe multiple type classes) that would allow for the following:
(++) :: Line -> Line -> Lines (++) :: Line -> Lines -> Lines (++) :: Lines -> Line -> Lines (++) :: Lines -> Lines -> Lines
I.e. is there a way to overload (++) such that it supports each of these 4 combinations? (Let's ignore that (++) already exists for the moment.)
Cheers, Hilco