【发布时间】:2018-04-18 19:54:10
【问题描述】:
如何将 Haskell 对象作为有效 Haskell 代码的字符串输出到省略现有 show 声明的输出?
例如,我有以下类型声明和对应的show 声明(check the code out in an online IDE):
{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
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] )
【问题讨论】:
-
将
deriving (Show)添加到您的数据声明中。不要覆盖Show。为非标准的showing 编写另一个函数versionNumber :: Version -> String。 -
如果您将
deriving Show添加到Version类型,print $ Version $ VersionNumber [ Just 1, Just 2, Nothing]应该可以工作,就像您为其他人所做的那样。 -
@chi:在这种情况下它抱怨
Duplicate instance declarations -
糟糕,我没有看到最后一个
Show Version实例。您是否有任何理由要保留该实例而不是默认实例? -
我只是认为我确实不需要保留
Show Version实例。这解决了我将对象“导出”为 Haskell 表示的问题。