【发布时间】:2013-08-19 12:54:38
【问题描述】:
我一直在阅读“Learn You a Haskell”一书,我正试图围绕 Haskell 类型类展开思考。作为实践,我正在尝试创建一个简单的矢量类型类。下面的 sn-p 代码让我有些悲痛(导致我在 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 的类型,那么它为什么会抱怨?我对这段代码有什么误解?
【问题讨论】:
-
提示,b 是普遍量化的。
-
提示,
(*) :: Num a => a -> a -> a,因为 b 是通用量化的,当你使用*时,编译器无法推导出a~b。