1年近くROMってました,今井敬吾といいます。

> data Vector3 = Vector3 { vx :: Double,
>                          vy :: Double,
>                          vz :: Double,
>                        }
>
> data Vector4 = Vector4 { vx :: Double,
>                          vy :: Double,
>                          vz :: Double,
>                          vw :: Double,
>                        }
>
> などとしたいのですが、
> そのままだとvx, vy, vzの名前が被っていると怒られてしまい 
> ます。
皆さまいろいろお考えのようですが、↑を読むかぎりでは、
シンプルにこれで良いんじゃあないでしょうか?
意図と違ってたらすみません。

-- vector.hs -->
class Vector3 v where
   vx :: v a -> a
   vy :: v a -> a
   vz :: v a -> a

class (Vector3 v) => Vector4 v where
   vw :: v a -> a

data V3 a = V3 a a a
data V4 a = V4 a a a a

instance Vector3 V3 where
   vx (V3 x _ _) = x
   vy (V3 _ y _) = y
   vz (V3 _ _ z) = z

instance Vector3 V4 where
   vx (V4 x _ _ _) = x
   vy (V4 _ y _ _) = y
   vz (V4 _ _ z _) = z

instance Vector4 V4 where
   vw (V4 _ _ _ w) = w

-- <-- vector.hs

% hugs vector.hs
Main> let v = V4 1 2 3 4 in (vx v, vy v, vz v, vw v)
(1,2,3,4)

Main> let v = V3 1 2 3 in (vx v, vy v, vz v, vw v)
ERROR - Cannot infer instance
*** Instance   : Vector4 V3
*** Expression : let {...} in (vx v,vy v,vz v,vw v)

Main> let v = V3 1 2 3 in (vx v, vy v, vz v)
(1,2,3)



----
Keigo IMAI
<sydney / agusa.i.is.nagoya-u.ac.jp>



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