
Hello,
The first solution by Alexis needs the languages extension for
multiparameter type classes to be on. So you have to add, e.g.
{-# LANGUAGE MultiParamTypeClasses #-}
at the beginning of your source file.
The second solution is preferable, of course.
--
Thanks, Artem
ср, 13 июня 2018 г. в 6:37, Alexis King
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
_______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.