吉田です。

学校の課題でレンダリングエンジンを書いていた時に気になったのですが、
皆さんdata record(という呼称が一般的かは知りませんが)の名前が
被った時はどうしているのでしょうか。

例えば、3次元のベクトルと4次元のベクトルを用意したいときに

data Vector3 = Vector3 { vx :: Double,
                         vy :: Double,
                         vz :: Double,
                       }

data Vector4 = Vector4 { vx :: Double,
                         vy :: Double,
                         vz :: Double,
                         vw :: Double,
                       }

などとしたいのですが、
そのままだとvx, vy, vzの名前が被っていると怒られてしまいます。
別なmoduleに分けて定義するのもこの場合は適切とは思えませんし、
かといってv3x, v4xなどと名前を変えるのも気持ち悪いです。

一つ思い付くのは、型クラスVectorを用意して

class Vector a where
  (!!!) :: a -> Integer -> Double

instance Vector Vector3 where
  (Vector3 x y z) !!! i | i == 0 = x
                        | i == 1 = y
                        | i == 2 = z

と添字でアクセスする方法なのですが、
出来ればx, y, zといった名前でアクセスしたいです。
かといってVectorクラスにx, y, z, wと定義するのは一般性に欠くので嫌です。

型クラスを介さない関数のオーバーロードが有れば一発で解決なのですが、
Haskellの作者さんはそれは美しくないとお考えなのでしょうか。
----
吉田 悠一
oxy / kmc.gr.jp
http://mono.kmc.gr.jp/~oxy/

--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/