
Happy Holidays, I was wondering if it this small snippet of code could be altered to require fewer OPTIONS -fallow-... switches. It creates a show-what-i-mean function called "swim" that takes a variable number of arguments, and treats strings as-is, calling show on the other arguments.
{-# OPTIONS -fglasgow-exts #-} {-# OPTIONS -fallow-undecidable-instances #-} {-# OPTIONS -fallow-incoherent-instances #-} {-# OPTIONS -fallow-overlapping-instances #-}
-- Want to show strings "as-is"
class (Show a) => MyShow a where myShow :: a -> String myShow = show
instance MyShow String where myShow = id
instance (Show b) => MyShow b
-- Want to take variable number of arguments
class PVShow a r where pvShow :: String -> a -> r
instance (MyShow b) => PVShow b String where pvShow oldString b = oldString ++ (myShow b)
instance (MyShow b,PVShow a r) => PVShow b (a->r) where pvShow oldString b = pvShow (oldString ++ (myShow b))
-- swim is short for Show What I Mean
swim :: (PVShow a r) => a -> r swim = pvShow ""
-- Demonstates of polymorphic and first class nature of swim
test foo = foo " and " 7 " are "
-- Tests
main = do putStrLn $ swim "Hello" " " "World #" [17,18,19] "!" putStrLn $ test (swim "I also think " [4,5,6]) "cool" "."
GHCI session: Main> main Hello World #[17,18,19]! I also think [4,5,6] and 7 are cool. *Main> Could this be improved by TypeEq machinery? Is there a Haskell 98 way to make myShow work this way? -- Chris Kuklewicz