Неоднозначное явление '=='

я только изучаю Хаскелла и все еще пытаюсь понять, как все работает.

поэтому я создаю класс списка, который может содержать смесь Int и Char.

data Algebra = Empty
|   Nmbr Int Algebra
|   Smbl Char Algebra

тогда я пытаюсь сделать его экземпляром Eq

instance Eq Algebra where
Empty == Empty              = True
(Nmbr x xl) == (Nmbr y yl)  = (x == y) && (xl==yl)
(Smbl x xl) == (Smbl y yl)  = (x == y) && (xl==yl)
_ == _                  = False

и я Ambiguous occurrence == ошибка компиляции. Он не может сказать разницу между Main.== и Prelude.==. Если я вручную заменю все == С Main.== или Prelude.== затем он компилирует нормально.

я не посмотрите, почему у компилятора здесь так много трудностей. x и y четко определены как Int или Char в каждом случае. Я сравнил то, что я делаю с многочисленными примерами учебника (например,http://www.haskell.org/tutorial/classes.html) и я не могу определить, почему компилятор такой рывок в этой ситуации: P

1 ответов


нужно отступ теле instance определение:

instance Eq Algebra where
  Empty == Empty              = True
  (Nmbr x xl) == (Nmbr y yl)  = (x == y) && (xl==yl)
  (Smbl x xl) == (Smbl y yl)  = (x == y) && (xl==yl)
  _ == _                  = False

в противном случае компилятор видит это как две вещи:

  • An instance Eq Algebra С пустым телом, производя определения по умолчанию a == b = not (a /= b) и наоборот.

  • определение нового оператора infix с именем ==.

затем с помощью == в вашем коде теперь возникает двусмысленность между == С Eq (определено в Prelude) и == в коде (Main).

и да deriving Eq дает вам именно такой вид структурного равенства.