2017-11-11 1 views
0

저는 하스켈에서 초보자이고 첫 번째 데이터 구조를 쓰고 있습니다.하스켈 데이터 "오류 - 스택 오버플로 제어"

예를 들어
data Nat = Null | N Nat 

: 5 내가 이미 Eq를 작성하고 작동 Show, Eq, Ord, Num, Enum

에서 인스턴스를 생성해야 N (N (N (N (N Null))))

입니다.

instance Eq Nat where 
    (==) Null Null = True 
    (==) (N Null) (N Null) = True 
    (==) Null (N Null) = False 
    (==) Null (N xs) = False 
    (==) (N xs) (N xs2) = xs == xs2 

그러나 이것을 포옹으로 시도하면 오류 ("오류 제어 스택 오버플로")가 발생합니다.

그리고 계속할 수 없습니다.

(N (N Null)) :: Nat 

무엇이 누락 되었습니까?

+2

여기 문제는 '쇼'라고 생각합니다. 그것이 당신의 질의 인 경우'(==)'를 호출하지 마십시오. 또한 Hugs는 기본적으로 죽었습니다 (2006 iirc 이후). 그래서 아마도 GHC를 더 잘 사용할 것입니다. –

+0

'(N x) == Null '인 경우도 잊어 버렸습니다. –

+0

답장을 보내 주셔서 감사합니다. 하지만 ghci에서 여전히 스택 오버 플로우가 발생합니다. –

답변

5

모든 사례를 다루고있는 것은 아닙니다. 또한, 다음과 같이 마지막 "나머지는 모두 잡아"케이스를 제작하여 정의를 단순화 할 수 있습니다 :

instance Eq Nat where 
    (==) Null Null = True 
    (==) (N xs) (N xs2) = xs == xs2 
    (==) _  _  = False 

나는 아무 생각하지만, 코드가 당신에게 스택 오버 플로우를 준 이유에 대해. 그것은 아마도 당신에게 비 포괄적 인 일치 오류를 주었을 것입니다.

어쨌든, Hugs는 현재 사용되지 않습니다. 업데이트없이 10 년 이상 지난 것입니다. GHC로 전환하고 Hugs 대신 ghci을 사용해야합니다. 당신은 여전히 ​​스택 오버 플로우를 얻을 경우


, 그것은 문제가 윌렘 반 Onsem 위의 지적대로, 무한 재귀를 정의 할 수있는 Show 인스턴스에 가능성이 높습니다.

당신은 그런데

instance Show Nat where 
    show Null = "Null" 
    show (N x) = "(N " ++ show x ++ ")" 

같은 것을 사용해야합니다 일부 표준 인스턴스가 자동으로 올바른 방법으로 생성 할 수 있습니다. 예를 들어,

data Nat = Null | N Nat deriving (Show, Eq, Ord) 

은 의도 한대로 작동해야합니다. 그러나 이것을 스스로 정의하는 것은 좋은 학습 방법입니다.

+0

답장을 보내 주셔서 감사합니다. 하지만 ghci에서는 여전히 스택 오버플로입니다. > Prelude Null -> Stack overflow –

+0

@ Marc-AurelP. 업데이트를 참조하십시오. – chi

+0

사실 내 쇼 방법이었습니다. 나는 탭을 사용하는 것을 잊었다. 나는 하스켈이 그렇게 민감하다는 것을 알지 못했다. 고맙습니다! –