色々な意見ありがとうございました。

僕の理想の姿を述べると
(1) Vector3にもVector4にもvx〜vzを使いたい
(2) Vector3にvwを適用するとコンパイル時にエラー
です。

(1)を満たすには確かにたけをさんの仰るように

data Vector = Vector3 { vx :: Double, ... }
            | Vector4 { vx :: Double, ... vw :: Double }

とするのが一番すっきりしていますね。
ただ今回は、ベクトルどうしの加算、減算をする必要があり、
不必要なランタイムエラーを避けるために
Vector3とVector4を分けるようにしてしまったので(設計ミスだったかもしれません)、
(2)も満たすような方法を考えたいところです。

ベクトルの要素数に関わらず演算を一発で定義できるなどのメリットがあるので、
ベクトルをArrayで定義するというのも捨てがたいのですが、
これもランタイムエラーは避けられません。

そうすると今井敬吾さんの方法が一番理想に近そうです。
ちょっとコード量が多いのが玉に瑕ですが、
それを逆手にとって、この方法のSyntax Sugarとして、
関数のオーバーロードを定義するというのも面白いかもしれないですね。

ちなみに#haskell:*.jpで教えていただいたのですが、
OpenGLでもベクトルの要素に名前ではアクセスできないようになっています。
(Graphics.Rendering.OpenGL.GL.VertexSpec参照)

----
吉田 悠一
oxy / kmc.gr.jp
http://mono.kmc.gr.jp/~oxy/

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