2

これが私のGADTです:

data Vector v where
    Zero    :: (Num a, Eq a, Show a) => Vector a
    Scalar  :: (Num a, Eq a, Show a) => a -> Vector a
    Vector  :: (Num a, Eq a, Show a) => [a] -> Vector [a]
    TVector :: (Num a, Eq a, Show a) => [a] -> Vector [a]

基本的には、型クラス Num、Eq、および Show に属する要素を含むベクトルを表しています。

Vector 自体を Num にしたいので、次のようにします。

instance Num (Vector v) where
    (Zero) + (Zero) = Zero
    -- etc
    (Vector a) * (Scalar b) = Vector $ map (* b) a -- This does not work

コードを実行すると、次のようになります。

Could not deduce (a ~ [a])
    from the context (v ~ [a], Num a, Eq a, Show a)
      bound by a pattern with constructor
                 Vector :: forall a. (Num a, Eq a, Show a) => [a] -> Vector [a],
               in an equation for `*'

なぜこれが起こっているのですか、どうすれば修正できますか?

4

1 に答える 1