3

私は「Learn You a Haskell」という本を読んでいて、Haskell 型クラスに頭を悩ませようとしています。練習として、単純なベクター型クラスを作成しようとしています。次のコード スニペットは、私にいくつかの悲しみを与えています (StackOverflow への最初の投稿につながりました)。

data Vec2 a = Vec2 (a,a) deriving (Show, Eq, Read)

class Vector a where
    (<*) :: (Num b) => a -> b -> a

instance (Num a) => Vector (Vec2 a) where
    Vec2 (x,y) <* a = Vec2 (a*x, a*y)

次のエラー メッセージが表示されます。

Could not deduce (a~b) from the context (Num a) or from (Num b) bound by the type signature for
    <* :: Num b => Vec2 a -> b -> Vec2 a

Num型クラスで指定されているものは の型をa提供Num aし、インスタンスの仕様はの型xを提供する必要があるように思えますがy、なぜ文句を言っているのでしょうか? このコードについてどのような誤解がありますか?

4

3 に答える 3

0

コンパイラは、関連する両方のNumインスタンスが実際に同じ型であることを確認できません。それらは確かにそれぞれのインスタンスですが、同じNumインスタンスでなければならないことも必要です。

それ以外の場合は、次のように記述できます。

Vec2 (1 :: Double, 2 :: Double) <* (3 :: Int)

実行するときに飛ばない、例: (1 :: Double) * (3 :: Int).

于 2013-08-17T04:39:53.920 に答える