2013-11-21 1 views
1

Hy, 자연 숫자에 대한 데이터 구조를 정의했으며 두 개의 숫자가 같은지 여부를 확인하기 위해 Eq 인스턴스를 정의하려고합니다. "모호한 발생 'Eq'. Main.eq 또는 Prelude.eq를 참조 할 수 있습니다. " 내가 잘못했을 수도 있습니다.Eq 인스턴스를 정의합니다 -Haskell

data Nat = Z | S Nat deriving Show 

class Eq a where 
    (==) :: a -> a -> Bool  

instance Eq Nat where 
    Z == Z = True 
    (S x) == (S y) = x == y 
    x == y = False 

고마워요!

+1

-> a -> Bool'은 중복되어 있습니다. –

답변

3

하스켈의 Prelude (표준 라이브러리와 유사)는 Eq 클래스를 정의합니다. 문제는 Haskell이 'Eq'가 정의한 클래스 또는 Haskell에 내장 된 클래스인지 여부를 알지 못한다는 것입니다.

클래스 이름 변경을 고려하십시오.

더 많은 정보 하스켈 서곡에 그 식는 여기에 있습니다 : 당신이 당신의 자신의`Eq`, 그래서`클래스의 식 a를 어디에 (==) :를 정의해서는 안 믿는다 http://hackage.haskell.org/package/base-4.6.0.1/docs/Prelude.html#t:Eq

1

Prelude와 다른 Eq이라는 클래스의 정의를 추가했습니다. 컴파일러는 instance Eq Nat을 작성할 때 인스턴스화하려는 인스턴스를 알지 못한다고 불평하고 있습니다.

코드에서 class Eq a where ...의 선언을 제거해야합니다.

+1

또는 정말로 자신 만의 롤을 만들고 싶다면'import Prelude hiding (Eq)'를 선택하십시오 (그러나 실제적인 코드에서는 그렇게하지 않아도됩니다). –