Haskell如何实现自定义类型用print替代show获得相同输出效果
问题解答
Haskell 中 print 函数的底层逻辑是 print = putStrLn . show,它会先对传入参数调用show方法,再将返回的字符串输出换行。
你当前的Show实例直接返回Sentence内部存储的字符串,所以show (S "y")得到的是不带引号的字符串y,此时调用print (S "y")输出的就是无引号的y。你之前在 GHCI 中执行show (S "y")看到带引号的"y",本质是 GHCI 对show返回的String类型结果又默认调用了一次print,而String类型的show实现会自动给内容加双引号。
要让print (S "y")直接输出带引号的"y",只需要修改你的Show实例实现,让show方法返回带引号的格式化字符串即可:
instance Show Sentence where show (S p) = show p
修改后执行print (S "y")就会直接输出"y",和你之前调用show (S "y")看到的输出完全一致。
内容的提问来源于stack exchange,提问作者D W
相关产品推荐
相关产品推荐

