私は「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
、なぜ文句を言っているのでしょうか? このコードについてどのような誤解がありますか?