2013-06-26 8 views
4

나는 book을 읽고있다, 그리고로이 두 가지 기능 ==, /=이 식에, 그들이 구현 Eq어떻게 Eq typeclass 함수를 구현합니까? x == y = not (x/= y) x/= y = not (x == y)는 작동합니까?

typeclass의 정의에 대해 이야기 :

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

이 책은 사람들이 말한다 상호 회귀이고, 함수의 결과는 다른 함수의 항목에 있습니다.

내가 이해할 수없는 것은 상호 재귀에 기본 사례가 표시되지 않는다는 것입니다. 왜 함수가 중지되어 결과를 반환하는지 이해할 수 없습니다.

답변

7

이러한 정의를 사용하면 상호 재귀가 중지되지 않고 무한 반복됩니다. 아이디어는 Eq typeclass를 구현할 때 자신의 기본 케이스로 두 정의 중 하나를 대체하는 것입니다.

그래서 예를 들어 당신이 당신의 Eq 예는 다음과 같이 할 수 data Foo = Bar | Baz 유형이있는 경우 : 여기

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