haskell - 在 Haskell 中,为什么我需要在实例声明中指定类型类?

标签 haskell

以下不编译:

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任何类型的类型类 ab ,但你给出了 == 的定义仅适用于 aEq 的成员(member).

这两件事是不一致的,所以 Haskell 不会试图猜测哪一个是你真正的意思,它只是将其报告为错误。该语言不必以这种方式工作,但它是一种深思熟虑的设计选择。

关于haskell - 在 Haskell 中,为什么我需要在实例声明中指定类型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24351265/

相关文章:

haskell - effective Haskell (B2.0) 中的 map 示例,第 58 页

optimization - 优化 Haskell 递归列表

haskell - 在模式同义词中调用函数

haskell - 什么编程任务为您提供了 monad 的突破?

multithreading - Haskell 如何在多核机器/集群上处理并行计算

parsing - Haskell 解析器到 AST 数据类型,赋值

Haskell - 打印数字

haskell - 我们可以抽象类型类吗?

arrays - 如何沿最内层维度对大量数组进行排序?

haskell - 绑定(bind)多个参数