fork download
  1. {-# LANGUAGE MultiParamTypeClasses #-}
  2.  
  3. import Data.Char (toUpper, toLower)
  4.  
  5. data Lower = Lower String deriving Show
  6. data Mixed = Mixed String deriving Show
  7. data Upper = Upper String deriving Show
  8.  
  9. toUpperStr = map toUpper
  10. toLowerStr = map toLower
  11.  
  12. class Make a where
  13. make :: String -> a
  14.  
  15. instance Make Lower where
  16. make s = Lower (toLowerStr s)
  17.  
  18. instance Make Mixed where
  19. make s = Mixed s
  20.  
  21. instance Make Upper where
  22. make s = Upper (toUpperStr s)
  23.  
  24. class Convert a b where
  25. convert :: a -> b
  26.  
  27. instance Convert Lower Lower where
  28. convert = id
  29.  
  30. instance Convert Lower Mixed where
  31. convert (Lower s) = Mixed s
  32.  
  33. instance Convert Lower Upper where
  34. convert (Lower s) = Upper (toUpperStr s)
  35.  
  36. instance Convert Mixed Lower where
  37. convert (Mixed s) = Lower (toLowerStr s)
  38.  
  39. instance Convert Mixed Mixed where
  40. convert = id
  41.  
  42. instance Convert Mixed Upper where
  43. convert (Mixed s) = Upper (toUpperStr s)
  44.  
  45. instance Convert Upper Lower where
  46. convert (Upper s) = Lower (toLowerStr s)
  47.  
  48. instance Convert Upper Mixed where
  49. convert (Upper s) = Mixed s
  50.  
  51. instance Convert Upper Upper where
  52. convert = id
  53.  
  54. main = print (convert ((make "Hello World") :: Lower) :: Upper)
  55.  
Success #stdin #stdout 0s 6232KB
stdin
Standard input is empty
stdout
Upper "HELLO WORLD"