やました です.

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

field label のことですね.

> と添字でアクセスする方法なのですが、
> 出来ればx, y, zといった名前でアクセスしたいです。
> かといってVectorクラスにx, y, z, wと定義するのは一般性に欠くので嫌です。
> 
> 型クラスを介さない関数のオーバーロードが有れば一発で解決なのですが、
> Haskellの作者さんはそれは美しくないとお考えなのでしょうか。

Haskell での考えかたは,究極の Duck Typing といえるのではないかと思い
ます.Ruby などの動的言語で Duck Typing というと,
「アヒルのように振舞うものは,アヒルに違いない」というものだと思います
が Haskell では 
「アヒルのように振舞うものは,アヒルでなくてはならない」
つまり「アヒルのように振舞うものは,アヒルである」ことを保証しているわ
けですね.^^;

妥協としては,型としては分けて用意せずに

aVec3 = listArray ('x','z') [1,2,3]
aVec4 = listArray ('w','z') [4,1,2,3]

などとして,

aVec3 ! 'x'
aVec4 ! 'w'

とかするか.4次元までしか使わないならやっぱりクラスをつかって,

class Vector v where
  vx :: v a -> a
  vy :: v a -> a
  vz :: v a -> a
  vw :: v a -> a
  vx = undefined
  vy = undefined
  vz = undefined
  vw = undefined
  
data Vector3 a = V3 a a a
instance Vector Vector3 where
  vx (V3 x _ _) = x
  vy (V3 _ y _) = y
  vx (V3 _ _ z) = z

とかかなぁ.でも,次元を超えたアクセスが実行時エラーというのは
ちょっといやかな.依存型がないからねぇ...

でも依存型があっても.名前問題は解決できないだろうしねぇ...

--nobsun

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