我有很长的数据类型,上面有很多记录。使用派生(Show(时的默认显示实现不再适用,因为它分布在几行上(并且变得不是人类可读的(。这就是为什么我想实例显示我的数据类型,每个记录字段输出一行
考虑以下片段,其中显示狗是我想要的:
data Cat = Cat { catname :: String , catcolor :: String } deriving (Eq, Show)
cat1 = Cat "Garfield" "orange"
cats = [ cat1 , Cat "Tom" "grey"]
data Dog = Dog { dogname :: String , dogcolor :: String } deriving (Eq)
instance Show ( Dog ) where
show (Dog named colord)= "Dog {n dogname = "++named++" n dogcolor = " ++ colord ++ "n }n"
dog1 = Dog "comet" "white"
dog2 = Dog "Odie" "yellow"
dogs = [dog1, dog2 ]
main = do { print cat1;
print cats;
print dog1;
print dogs
}
运行时,它会给出以下内容:
*Main> main
Cat {catname = "Garfield", catcolor = "orange"}
[Cat {catname = "Garfield", catcolor = "orange"},Cat {catname = "Tom", catcolor = "grey"}]
Dog {
dogname = comet
dogcolor = white
}
[Dog {
dogname = comet
dogcolor = white
}
,Dog {
dogname = Odie
dogcolor = yellow
}
]
*Main>
如何以通用方式实现此结果,即不特定于数据类型 Dog?(例如在Java中,它将带有内省(我有许多数据类型和许多记录字段,因此不能为每个数据执行一个实现
pretty-simple
评论中提到的软件包。
为了获得漂亮的印刷品,我使用包装pretty-show
(顺便说一句,没有这个包装我就活不下去(。
import Text.Show.Pretty
data Cat = Cat { catname :: String , catcolor :: String }
deriving (Eq, Show)
data Dog = Dog { dogname :: String , dogcolor :: String }
deriving (Eq, Show)
cat1 = Cat "Garfield" "orange"
cats = [cat1 , Cat "Tom" "grey"]
dog1 = Dog "comet" "white"
dog2 = Dog "Odie" "yellow"
dogs = [dog1, dog2 ]
main :: IO ()
main = do
pPrint cat1
pPrint cats
pPrint dog1
pPrint dogs
这给出了:
Cat { catname = "Garfield" , catcolor = "orange" }
[ Cat { catname = "Garfield" , catcolor = "orange" }
, Cat { catname = "Tom" , catcolor = "grey" }
]
Dog { dogname = "comet" , dogcolor = "white" }
[ Dog { dogname = "comet" , dogcolor = "white" }
, Dog { dogname = "Odie" , dogcolor = "yellow" }
]
pretty-show
中另一个有用的函数是 ppShow :: Show a => a -> String
,它将泛型值转换为漂亮的字符串(如果可能的话(。那么pPrint
函数只不过是
pPrint = putStrLn . ppShow