2011-11-19 104 views
5

我有一个问题: 如何覆盖字符串或字符的显示方法? 谢谢。替换Haskell中的字符串/字符的显示方法

+1

是不是有一个原因,你不想只定义一些其他函数类型的字符 - >字符串或字符串 - >字符串?你为什么要重写'show'? – hammar

+4

我想你必须把它包装在一个[新类型](http://www.haskell.org/haskellwiki/Newtype)中并为该类型定义Show。 –

回答

2

如果你想要这样做,那么你做错了。

有关更多技术原因,请参阅上一个问题的my answer

真的应该使用无论是你自己a -> String功能(可能通过自己的类型类),或者使用更详细的输出漂亮印刷库(其中一些已经有一个内置的Pretty类)。

8

由于人们似乎喜欢我的意见,这是作为一个答案:

如果你想在现有的类型重新实现类型类,你可以在一个newtype -declared型包装他们。这允许您定义自己的实现,而不会在运行时产生任何实际开销(因为newtype与原始类型是同构的,所以在运行时没有实际的装箱)。

这可能是这个样子:

newtype MyChar = MyChar Char 

instance Show MyChar where 
    show (MyChar c) = "head \"" ++ c : "\"" 

您可以使用此通过包装Char s的MyChar,就像这样:

print $ fmap MyChar "test" 

这将打印出

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

你也可以定义showList,然后MyChar的列表也会自定义格式。实际上,这就是显示字符列表([Char])的行为与显示其他列表([a])不同的原因。 – sdcvvc