显示通常为每个归档记录显示一行的实现

  • 本文关键字:显示 一行 实现 记录 haskell
  • 更新时间 :
  • 英文 :


我有很长的数据类型,上面有很多记录。使用派生(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

最新更新