toString と show と

HaskellでtoString - 西尾泰和のはてなダイアリー にて,この前の 「Haskell で toStringを定義する方法 」を書いてくれた.

確かにtoString は実装できるのだけど,すでに show という手段があるのだから,

  • 通常はデフォルトのshow を使って
  • ある一部のクラスについてはshow をカスタマイズしたい

という書き方ができるとなおよい(JavaはtoStringをオーバーライドすればできる),これがどうもうまくいかない

data Bar = Bar Int 
data Foo = Foo Bar deriving Show
show Foo b = "" ++ show b ++""
main = show (Foo (Bar 5)) 

こんなエラーがでる.

Ambiguous occurrence `show'
It could refer to either `show', defined at C:/eclipse/workspace/haskell/src/Test.hs:5:3
		          or `show', imported from Prelude

ようは show の定義が2つあるからどっちを採用すればわからん,ということらしい.
よりspecific なほうを採用する,というOO な考えはやっぱり関数型言語にはないのだろうか.