String 重写Haskell中字符串/字符的show方法

String 重写Haskell中字符串/字符的show方法,string,haskell,char,overriding,show,String,Haskell,Char,Overriding,Show,我有一个问题: 如何重写String或Char的show方法? 谢谢。因为人们似乎喜欢我的评论,这里是一个答案: 如果您想在现有类型上重新实现类型类,可以将它们包装为声明的类型。这允许您定义自己的实现,在运行时没有任何实际开销(因为newtype与原始类型同构,在运行时没有实际装箱) 这可能看起来像这样: newtype MyChar = MyChar Char instance Show MyChar where show (MyChar c) = "head \"" ++ c : "\

我有一个问题: 如何重写String或Char的show方法?
谢谢。

因为人们似乎喜欢我的评论,这里是一个答案:

如果您想在现有类型上重新实现类型类,可以将它们包装为声明的类型。这允许您定义自己的实现,在运行时没有任何实际开销(因为
newtype
与原始类型同构,在运行时没有实际装箱)

这可能看起来像这样:

newtype MyChar = MyChar Char

instance Show MyChar where
  show (MyChar c) = "head \"" ++ c : "\""
您可以通过使用
MyChar
包装
Char
来使用它,如下所示:

print $ fmap MyChar "test"
这将打印出来

[head "t",head "e",head "s",head "t"]

如果你想这么做,那你就做错了

要了解更多的技术原因,请参阅前面的问题


你应该使用你自己的
a->String
函数(可能通过你自己的类型类)或者使用一个漂亮的打印库来获得更详细的输出(其中一些已经内置了
pretty
类).

您为什么不想只定义一些类型为
Char->String
String->String
的其他函数?为什么要覆盖
show
?我认为您必须将其包装在一个文件中,并为该类型定义show。您还可以定义showList,那么MyChar的列表也将具有自定义格式。事实上,这就是为什么显示字符列表([Char])的行为不同于显示其他列表([a])。