Haskell 显示通常每个记录字段显示一行的实现

Haskell 显示通常每个记录字段显示一行的实现,haskell,Haskell,我有很长的数据类型,上面有很多记录。当使用派生(show)时,默认的show实现不再适用,因为它在几行上传播(并且变得不可读)。这就是为什么我想为我的数据类型显示一个实例,每个记录字段输出一行 考虑以下代码片段,其中show Dog是我想要的: data Cat = Cat { catname :: String , catcolor :: String } deriving (Eq, Show) cat1 = Cat "Garfield" "orange" cats = [ cat1 , Ca

我有很长的数据类型,上面有很多记录。当使用派生(show)时,默认的show实现不再适用,因为它在几行上传播(并且变得不可读)。这就是为什么我想为我的数据类型显示一个实例,每个记录字段输出一行

考虑以下代码片段,其中show Dog是我想要的:

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>
如何以通用的方式实现此结果,即不特定于数据类型? (例如,在Java中,它将与内省一起使用)
我有许多数据类型和许多记录字段,因此每个数据执行一个实现不是一个选项

我不知道注释中提到的包
非常简单

为了得到一张漂亮的照片,我使用了套装
pretty show
(顺便说一句,没有这个套装我就活不下去了)

这使得:

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
,它将通用值转换为pretty字符串(如果可能的话)。那么
pPrint
函数就是

pPrint = putStrLn . ppShow

为什么不
非常简单
@威廉·瓦农森:天哪,这就是我需要的!谢谢或
pPrint = putStrLn . ppShow