
Udo Stenzel wrote:
This is your only special case, a single list of a sigle type that is different from other lists? To avoid undecidable, incoherent and other nasty instances, just do what the Prelude does:
class MyShow t where swim :: t -> String swimList :: [t] -> String swimList [] = "[]" swimList xs = '[' : foldr1 (\x -> (swim x ++) . (',' :)) "]" xs
instance MyShow Char where swim = (:[]) swimList = id
Untested, but you get the idea. It's pure Haskell 98. Heck, it's almost Prelude.Show. It won't scale to more type constructors easily, but you didn't ask for that ability, either ;-)
Udo.
You example treats Char specially. I want (swim 'a') to be ("'a'") not ("a"). I want every type but String to eventually use the builtin "show" function. This is not what your example does unless I make it longer. For example, if I wrote instance MyShow Int where swim = show instance MyShow Double where swim = show ... many many instances ... then it would work. I need for the compiler to understand that MyShow String has swim = id and MyShow (any other Show instance but String) has swim = show. GHC can do this, the working examples with -fallow* prove it. I was curious if there is some type level programming knowledge in the Haskell community which would allow me to express (any other Show instance but String) in a non-overlapping way. I can read the HList and OOHaskell work, and see the advanced type level programming, but I am not yet clever enough to derive a solution for MyShow. -- Chris