Как работает реализация функции класса типов 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
обеспечивает реализации по умолчанию для обоих ==
а также /=
так что вы можете решить, хотите ли вы дать определение для ==
или же /=
и вы получите другой бесплатно, даже если вы выберете /=
,