いけがみです。

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

 http://www.haskell.org/tmrwiki/NumberParamTypes

に紹介されている方法を使うと可能です。

ソースコードだけ抜き出すとこんな感じ:
(ちょろっと改変)

import Data.Array

data Zero = Zero
data Succ a = Succ a
type One = Succ Zero
type Two = Succ One
type Three = Succ Two
type Four = Succ Three

instance Enum Zero where
  fromEnum Zero = 0
  toEnum 0 = Zero
  toEnum _ = undefined

instance Enum a => Enum (Succ a) where
  fromEnum (Succ x) = 1 + fromEnum x
  toEnum x | x > 0  = Succ (toEnum (x-1))
           | otherwise = undefined

newtype Vec size a = Vec (Array Int a) deriving Show

listVec :: Enum size => size -> [a] -> Vec size a
listVec n xs | not (len == length xs) = error "dynamic error: illegal size"
             | otherwise = Vec $ listArray (0, len - 1) xs
    where len = fromEnum n

vz :: Vec (Succ (Succ (Succ s))) a -> a
vz (Vec ary) = ary ! 2

test2 :: Vec Two Integer
test2 = listVec (toEnum 2) [1, 2]
test3 :: Vec Three Integer
test3 = listVec (toEnum 3) [1, 2, 3]
test4 :: Vec Four Integer
test4 = listVec (toEnum 4) [1, 2, 3, 4]

---------
ghci> vz test2
<interactive>:1:3:
    Couldn't match `Succ s' against `Zero'
      Expected type: Vec (Succ (Succ (Succ s))) a
      Inferred type: Vec Two Integer
    In the first argument of `vz', namely `test2'
    In the definition of `it': it = vz test2
ghci> vz test3
3
ghci> vz test4
3
 

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