替换Haskell中的字符串/字符的显示方法
答
如果你想要这样做,那么你做错了。
有关更多技术原因,请参阅上一个问题的my answer。
你真的应该使用无论是你自己a -> String
功能(可能通过自己的类型类),或者使用更详细的输出漂亮印刷库(其中一些已经有一个内置的Pretty
类)。
答
由于人们似乎喜欢我的意见,这是作为一个答案:
如果你想在现有的类型重新实现类型类,你可以在一个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
是不是有一个原因,你不想只定义一些其他函数类型的字符 - >字符串或字符串 - >字符串?你为什么要重写'show'? – hammar
我想你必须把它包装在一个[新类型](http://www.haskell.org/haskellwiki/Newtype)中并为该类型定义Show。 –