我在“Learn You a Haskell for Great Good”的帮助下学习 Haskell!并且目前正在尝试了解类型类和实例。LYAH 提供了一个示例,其中调用的类型TrafficLight
定义如下:
data TrafficLight = Red | Yellow | Green
现在TrafficLight
应该是Eq
显示以下行为的一个实例:
instance Eq TrafficLight where
Red == Red = True
Green == Green = True
Yellow == Yellow = True
_ == _ = False
为了理解它是如何工作的,我编写了自己的文件Shop.hs
,名为我尝试覆盖Eq
我的ItemSlot
.
module Shop where
type Number = Int
data Item =
BellPepper
| Cabbage
| Carrot
| Lettuce
| Onion
| Potato
| Tomato
deriving (Show, Read, Eq)
data ItemSlot = ItemSlot {
item :: Item,
number :: Number
} deriving (Show)
instance Eq ItemSlot where
((item a) == (item a)) = True -- line that contains the error
_ == _ = False
但是,如果我在 GHCi 中加载文件,我会收到以下错误:
Prelude> :l Shop.hs
[1 of 1] Compiling Shop ( Shop.hs, interpreted )
Shop.hs:21:11: Parse error in pattern: item
Failed, modules loaded: none.
(我必须承认,我对这里的正确语法感到很困惑——是它item a
还是只是item
?使用仅item
失败并出现相同的错误,并且使用更多括号——就像在 SO 上的另一个类似问题的答案一样——没有似乎也有帮助。)
我的猜测是我无法使用 中使用item
的记录语法提供的功能ItemSlot
,但是我不知道如何解决该问题。