Как работает реализация функции класса типов Eq: x == y = not (x /= y) x /= y = not (x == y)?

Я читаю книгу, и она говорит об определении типа классов Eq

Есть две функции ==, /= в уравнении, и они реализованы как:

  x == y = not (x /= y)  
  x /= y = not (x == y)  

В книге говорится, что они взаимно рекурсивны, результат функции находится в элементе другой функции.

Чего я не понимаю, так это того, что я не вижу базового случая во взаимной рекурсии, и я не понимаю, почему функции остановятся и вернут результат.

1 ответ

Решение

С этими определениями взаимная рекурсия не остановится - она ​​будет повторяться бесконечно. Идея состоит в том, что вы переопределяете одно из двух определений своим собственным базовым случаем при реализации Eq класс типов.

Так, например, если у вас есть тип data Foo = Bar | Baz ваш Eq Экземпляр может выглядеть так:

instance Eq Foo where
  Bar == Bar = True
  Baz == Baz = True
  _   == _   = False

Здесь мы только определили ==не /=, так /= будет использовать определение по умолчанию not (x == y), Однако наше определение == не буду звонить /= назад, поэтому он больше не является взаимно рекурсивным и завершится без проблем.

Причина того, что Eq обеспечивает реализации по умолчанию для обоих == а также /= так что вы можете решить, хотите ли вы дать определение для == или же /= и вы получите другой бесплатно, даже если вы выберете /=,

Другие вопросы по тегам