gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:52:53 25 4
gpt4 key购买 nike

以下不编译:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com