Я изучаю Haskell с помощью "Learn You a Haskell for Great Good!" и в настоящее время я пытаюсь понять классы типов и экземпляры. 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
, но, тем не менее, я не знаю, как решить эту проблему.