2011-11-19 102 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