以下不编译:
data Point a b = Point { x :: a
, y :: b
} deriving (Show)
instance Eq (Point a b) where
(Point x _) == (Point y _) = x == y
错误是:
No instance for (Eq a)
arising from a use of `=='
In the expression: x == y
In an equation for `==': (Point x _) == (Point y _) = x == y
In the instance declaration for `Eq (Point a b)'
但是,如果我将类型类添加到实例中,则它可以工作:
data Point a b = Point { x :: a
, y :: b
} deriving (Show)
instance (Eq a) => Eq (Point a b) where
(Point x _) == (Point y _) = x == y
编译器看不到我正在使用
a == a
在那里推导出 a
必须在类型类 Eq
中?
最佳答案
它可以推断a
必须属于类型类 Eq
.这正是它提示的原因。您声明了 instance Eq (Point a b)
, 表示形式 Point a b
的类型在 Eq
任何类型的类型类 a
和 b
,但你给出了 ==
的定义仅适用于 a
是 Eq
的成员(member).
这两件事是不一致的,所以 Haskell 不会试图猜测哪一个是你真正的意思,它只是将其报告为错误。该语言不必以这种方式工作,但它是一种深思熟虑的设计选择。
关于haskell - 在 Haskell 中,为什么我需要在实例声明中指定类型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24351265/