2013-06-26 18 views
4

Читаю book, и это говорит об определении класса типов EqКак реализуется реализация функции Eq typeclass: x == y = not (x/= y) x/= y = not (x == y)?

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

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

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

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

ответ

7

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

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

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

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

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

+4

С [моим предложением] (http://hackage.haskell.org/trac/ghc/ticket/7633) - надеюсь, что в следующей версии GHC вы можете указать минимальное полное определение класса с возможностью компиляции, чтобы вы получили предупреждение, если бы не реализовали какой-либо метод. – shachaf

+0

@ sepp2k спасибо за ваше объяснение. На самом деле, есть объяснение в книге чуть ниже, но я не мог понять, что она существует ... – code4j