String 重写Haskell中字符串/字符的show方法
我有一个问题: 如何重写String或Char的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 : "\
谢谢。因为人们似乎喜欢我的评论,这里是一个答案: 如果您想在现有类型上重新实现类型类,可以将它们包装为声明的类型。这允许您定义自己的实现,在运行时没有任何实际开销(因为
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])。