如何将Haskell对象作为有效Haskell代码的字符串输出到忽略现有
show
声明?
例如,我有以下类型声明和相应的
显示
声明(
check the code out in an online IDE
):
{-
import Data.Maybe
type VersionCompound = Maybe Int
data VersionNumber = VersionNumber [VersionCompound] deriving (Show)
data MaturityLevel = Dev
| Test
| User
| ReleaseCandidate
| Prod
deriving (Show)
data Version = MaturityVersion MaturityLevel VersionNumber
| Version VersionNumber
class ToString a where
toString :: a -> String
instance ToString VersionCompound where
toString (Just n) = (show n)
toString Nothing = "x"
instance ToString [VersionCompound] where
toString [] = ""
toString (x:[]) = (toString x)
toString (x:xs) = (toString x) ++ "." ++ (toString xs)
instance ToString VersionNumber where
toString (VersionNumber []) = ""
toString (VersionNumber (x:[])) = (toString x)
toString (VersionNumber (x:xs)) = (toString x) ++ "." ++ (toString xs)
instance ToString Version where
toString (MaturityVersion maturityLevel versionNumber) = (show maturityLevel) ++ "/" ++ (toString versionNumber)
toString (Version versionNumber) = (toString versionNumber)
instance Show Version where
show version = toString version
main = putStrLn $ show (Version $ VersionNumber [ Just 1, Just 2, Nothing])
该程序的输出为:
1.2.x
但有没有办法以有效的Haskell代码的形式输出对象?例如,对于上面的代码
showIntact $ Version $ VersionNumber [ Just 1, Just 2, Nothing]
将输出如下内容:
Version ( VersionNumber [ Just 1, Just 2, Nothing] )