我一直在通过“学习你一个Haskell”书,我试图包裹我的头哈斯克尔类型类。作为练习,我试图创建一个简单的矢量类型的类。下面的代码片段一直给我一些悲伤(导致我的第一篇到StackOverflow上):Haskell Typeclass类型限制和扣除
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
的类型,那么它为什么会抱怨?我对这段代码有什么误解?
提示,b是普遍量化的。 – augustss
提示,'(*):: Num a => a - > a - > a',因为b是通用量化的,所以编译器在使用'*'时不能推导出'a〜b'。 – Satvik