2011-12-09 6 views
0

경우 비 철저한 패턴 , 10) - (182,74) : 경우의 비 한정적인 패턴하스켈 나는 다음과 같은 코드를 가지고있다

여기서 행을 나타내는 숫자는 "= case F '(pc : pcs) (readC pc 코어)"에서 "to "FAll 코어"((name, pcs ') : acc) ps "

나는이 문제가 (PC : PC)에 대한 패턴을 고갈시키는 것이라고 생각하지만 어떻게 해결할 수 있는지 이해할 수 없다.

도움을 주시면 감사하겠습니다.

코드는이 일에 업데이트되었습니다

Just (core', (pc' : pcs')) -> let 
            pc'' = pc' `mod` coresize 
            pcs' = pcs' ++ [pc''] 
           in stepAll core' ((name, pcs') : acc) ps 
Just (core', []) -> stepAll core acc ps 

하지만 프로그램이 바로 무한 루프에 빠진다 :

나는 다음과 같은 쓴 S

+0

나는 수정 된 코드가 사건 검사와 무관 한 알고리즘 버그가 있다고 의심하지만 코드가 무엇을하고 있는지 전혀 알지 못한다. (대문자로 된 식별자가있는 것 같기 때문에 약간의 의미가 혼란 스럽다. 내가 기대하지 않는 곳) 나는 무엇을 조언해야할지 모르겠다. –

+0

무한 루프는'pcs '= pcs'++ [pc '']'에 의한 것입니다. 이 방정식의'pcs '는 모두 동일합니다. 새로운 변수는'Just' 패턴에서 동일한 이름을 가진 새로운 변수입니다. 따라서'pcs'가 무한 루프를 나타내는'pcs '를 자체적으로 정의하려고합니다. '는 항상 요구된다. 당신은 아마 stepAll core '((name, pcs' ') : acc) ps'에서'let ... pcs' '= pcs'++ [pc '']를 원했습니다. –

+0

아, 나는 다른 경우와 마찬가지로'pcs ++ [pc '']'로 잘못 읽었습니다. 그래, 그게 니가 무한 루프를 얻는 이유라고 생각해. –

답변

8

"비 철저한 패턴을" 가능한 모든 조합을 포괄하지 못하는 패턴 일치 집합을 가짐을 의미합니다. 당신의 코드에서 같은 경우를 다음

case {- stuff -} of 
    Nothing ->    -- etc. 
    Just (core', [pc']) -> -- etc. 

당신은 Maybe 부분 모두에 패턴을 처리하고 쌍은 하나 개의 패턴을 가지고 있지만, 당신은 단일 요소를 에만 목록과 일치하므로이 Just (core', []) 또는 Just (core', (pc' : pcs'))과 같은 패턴의 경우 실패합니다.

일부 사례가 발생하지 않을 것으로 예상되는 경우에도 모든 가능한 경우를 처리하는 것이 가장 좋습니다 (즉, 철저한 패턴 일치). 사례가 불가능하다는 것이 정말로 확실한 경우 error "this will never happen because blah blah blah"과 같은 것을 사용하십시오. 왜 그런 일이 일어나지 않을지 설명 할 수 없다면 제대로 처리하는 것이 좋습니다. :]