参照透明?

私は未だ Haskell については入門者の域を出ていない。 検討違いなところをうろついているような気もするが、どう理解すればいいのかわからないことがあったので、書いておくことにする。
Haskell の重要な特徴のひとつに「参照透明」がある。 同じ式は常に同じ結果を返すというやつだ。
だが、 Haskell の場合は C++ と違って関数の返り値の型のみが違うような関数を書ける。 文字列が必要とされる場合には文字列を返し、数が必要な場合には数を返すというような関数も書ける。
例示する。

{-# OPTIONS
-XIncoherentInstances -XFlexibleInstances 
-XUndecidableInstances -XTypeSynonymInstances 
 #-} 

class One a where
    one :: a 

instance One String where
    one = "one" 

instance (Num a) => One a where
    one = 1 

main = do
  print $ one ++ " two"; 
  print $ one + 2; 

これで言えば、 one という式が "one" という文字列であることもあるし、 1 という数であることもある。 同じ式が別の結果を返しているではないか。
同じ名前の別の関数にディスパッチされていると考えればいいのだろうか。 それにしたところで、プログラマの視点で言えば参照透明の利点を亨受できているとは言い難いと思うのだけれど。
Document ID: 7831387758060963c50d13f16fbbdffb