【发布时间】:2012-08-26 14:08:16
【问题描述】:
我在“Learn You a Haskell for Great Good!”的帮助下学习 Haskell!并且我目前正在尝试了解类型类和实例。
LYAH 提供了一个example,其中一个名为TrafficLight 的类型定义如下:
data TrafficLight = Red | Yellow | Green
现在TrafficLight 应该是Eq 的一个实例,显示以下行为:
instance Eq TrafficLight where
Red == Red = True
Green == Green = True
Yellow == Yellow = True
_ == _ = False
为了了解它是如何工作的,我编写了自己的文件 Shop.hs,在该文件中我尝试为我的 ItemSlot 覆盖 Eq 的行为。
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 上另一个类似问题的答案一样 - 似乎也无济于事。)
我的猜测是我无法使用ItemSlot 中使用的记录语法提供的item 函数,但是我不知道如何解决这个问题。
【问题讨论】:
标签: haskell parse-error