fork download
  1. {-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
  2.  
  3. import Data.Maybe
  4.  
  5. type VersionCompound = Maybe Int
  6.  
  7. data VersionNumber = VersionNumber [VersionCompound] deriving (Show)
  8.  
  9. data MaturityLevel = Dev
  10. | Test
  11. | User
  12. | ReleaseCandidate
  13. | Prod
  14. deriving (Show)
  15.  
  16. data Version = MaturityVersion MaturityLevel VersionNumber
  17. | Version VersionNumber deriving (Show)
  18.  
  19. class ToString a where
  20. toString :: a -> String
  21.  
  22. instance ToString VersionCompound where
  23. toString (Just n) = (show n)
  24. toString Nothing = "x"
  25.  
  26. instance ToString [VersionCompound] where
  27. toString [] = ""
  28. toString (x:[]) = (toString x)
  29. toString (x:xs) = (toString x) ++ "." ++ (toString xs)
  30.  
  31. instance ToString VersionNumber where
  32. toString (VersionNumber []) = ""
  33. toString (VersionNumber (x:[])) = (toString x)
  34. toString (VersionNumber (x:xs)) = (toString x) ++ "." ++ (toString xs)
  35.  
  36. instance ToString Version where
  37. toString (MaturityVersion maturityLevel versionNumber) = (show maturityLevel) ++ "/" ++ (toString versionNumber)
  38. toString (Version versionNumber) = (toString versionNumber)
  39.  
  40. instance Show Version where
  41. show version = toString version
  42.  
  43. main = putStrLn $ print (Version ( VersionNumber [ Just 1, Just 2, Nothing]) )
Compilation error #stdin compilation error #stdout 0s 4372KB
stdin
Standard input is empty
compilation info
[1 of 1] Compiling Main             ( prog.hs, prog.o )

prog.hs:17:40: error:
    Duplicate instance declarations:
      instance Show Version -- Defined at prog.hs:17:40
      instance Show Version -- Defined at prog.hs:40:10
stdout
Standard output is empty