2012-03-29 5 views
1

트리가 완전한지 아닌지를 확인하는 함수를 표준 ml로 만들고 싶습니다. 함수가 어떻게 든 작동하지만 잘못된 유형 및 비 한정적인 경우에 대한 경고를줍니다.트리가 완전한지 확인하십시오. ml

트리 코드 : 이제

datatype 'data tree = 
    EMPTY 
| NODE of 'data tree * 'data * 'data tree; 

fun isComplete EMPTY = true 
    | isComplete (NODE(x, y, z)) = if (x = EMPTY andalso z <> EMPTY) orelse (x <> EMPTY andalso z = EMPTY) then false else true; 

위의 함수의 유형은 다음과 같습니다 ''a tree -> bool하지만 필요한 유형이 나는 데 경고가 'a tree -> bool

입니다 :

stdIn:169.8 Warning: calling polyEqual 
stdIn:169.26 Warning: calling polyEqual 
stdIn:169.45-169.47 Warning: calling polyEqual 
stdIn:169.64-169.66 Warning: calling polyEqual 
stdIn:124.1-169.94 Warning: match nonexhaustive 
      NODE (x,y,z) => ... 

내가 가지고있는 문제는 무엇입니까?

편집 : 마이클

덕분에, 나는 코드를 고정 지금은 작동 다음 polyEqual 경고에 관한

- fun isComplete EMPTY = true 
    | isComplete (NODE(EMPTY, _, EMPTY)) = true 
    | isComplete (NODE(NODE(x, y, z), _, NODE(a, b, c))) = true 
    | isComplete (EMPTY, _, NODE(x, y, z)) = false 
    | isComplete (NODE(x, y, z), _, EMPTY) = false; 
+0

EDIT 코드가 여전히 올바르지 않습니다. 그것은 재귀가 아닙니다. 왼쪽과 오른쪽에있는 노드는 완료되지 않을 수 있습니다. – Milwaukoholic

답변

0

''a tree -> bool 유형은 a은 평등 유형을 나타냅니다 : 그것은 equals와 테스트를 지원하는 유형이어야합니다. xz을 테스트하기 위해 =<>을 사용하고 있으므로 트리 데이터는 값으로 흥미로운 작업을 수행하고 있지는 않더라도 평등을 지원해야합니다. 이것이 polyEqual 경고의 근원입니다.

비 포괄적 인 경고는 더 수수께끼입니다. 귀하의 데이터 유형 및 함수 정의를 모스크바 ML에 붙여 넣을 때 이 아니며 경고 메시지가 나타납니다. 나는 경고를 처리하기 위해 유형을 고치기를 기대하면서 나는 그것에 대해 너무 많이 걱정할 것이라고 생각하지 않는다.

'a tree -> bool 원하는 유형을 얻으려면 if을 제거하여 패턴 일치를 제안하는 것이 좋습니다. 예 :

fun isComplete EMPTY = true 
    | isComplete (NODE(EMPTY, _, EMPTY)) = true 
    | isComplete (NODE(EMPTY, _, NODE(x,y,z))) = false 
    | ... (* fill out the rest of the cases *) 

숙제와 같이 전체 사례를 파악하기 위해 맡기 겠습니다.

덧붙여 말하자면, 완전성 테스트가 정확하다고 생각하지 않습니다. 하위 트리가 모두 EMPTY 일 때 어떤 일이 일어나는지 고려하십시오. 내용을 고려하지 않고 트리를 호출합니다. 그래도보고있는 경고와 관련이 없습니다.

+0

SML/NJ를 사용하고있다. 나는 그것을 사용하고 있기 때문에 그것을 사용하고 있기 때문에 나는 경고를 가지고있다. 어쨌든, 내가 지금 일할 수있는 조언 주셔서 감사합니다 Thanks Michael –

+0

@ aizen92 SML/NJ가 설치되어 있지 않으므로 불행히도 테스트 할 수 없습니다. 'if','andalso'와'orelse'가 실제로 패턴 매칭의 특수한 경우라고 생각할 때, SML/NJ와 MosML은 단지'if' 표현식을 다른 구조의 패턴 매칭으로 변환하는 것 같습니다. 그 중 일부는 철저합니다.기본 결론 : 선호 패턴 일치! –

0

: SML/NJ에서이 경고는이 연산자를 사용할 때마다 인쇄되어 있지만, 그렇다고해서 코드에 결함이있는 것은 아닙니다. 여기에 대한 블로그 게시물, 그리고 경고가 주어진 이유를 코멘트에 누군가가 설명 : http://abstractfactory.blogspot.fr/2006/05/sml-hacking-tip-turn-off-polyequal.html

+0

괜찮 으면 좋겠지 만, 완전하지 않은 것은 어떨까요? 어떤 경우가 누락 되었습니까? –

+0

나는 정말로 모른다. 나는 지금 당장은 통역이 없다 ... – Alex