2012-10-13 1 views
0

이 과제는 여기에 Induction to Programming using sml 5.14반전 '목록 목록 ->'B 목록 목록 있지만, 패턴 매칭을 점점 철저하지

내 코드는하지만이 메시지 패턴 매칭은 기본 경우에 철저하지 얻을에서 ..

fun revrev [] = [[], []] 
    | revrev [x::xs,y::ys] = revrev[[email protected][y], xs @ [x]]; 


val test1revrev = revrev [[1, 2],[3, 4, 5]]; 

From valtest1 I want the output [[5, 4, 3], [2, 1]] 

나는 왜 내 기능이 작동하지 않으며 약간의 통찰력이 필요할지 모르겠다. 이 두 요소를 빈 목록 또는 목록 중 하나와 일치하기 때문에이 작품 예를 들어

...

fun rev [] = [] 
    | rev (x::xs) = rev1 xs @ [x]; 

val test1rev = rev [1, 2, 3]; 
I get [3, 2, 1] 

답변

3

패턴 매칭은 철저한 없습니다.

운동의 의도는 전에 소개 된 rev을 기반으로 revrev을 구현하는 것입니다. 다음은 몇 가지 팁입니다.

  • 기본 사례는 빈 목록입니다. 빈 목록 만 반환하면됩니다.
  • 귀납적 상자는 비어 있지 않은 목록과 일치합니다. x::xs. rev 구현과 마찬가지로 xsrevrev을 호출하고 끝에 x의 변형을 넣을 수 있습니다. 이번에는 rev을 사용하여 x 그 자체도 뒤집을 수 있습니다.

편집 :

함수는 일반적으로 경우에 작동하지 않습니다. x도 목록입니다

fun revrev [] = [] 
    | revrev (x::xs) = ... 

: 내가 의미하는 것은 다음과 같은 골격이다. 이 기능은 rev과 매우 유사하므로 ...을 직접 채울 수 있기를 바랍니다.

+0

도움을 주신 분 – user1742595

+0

안녕하세요. 몇 가지 힌트를 더 보려면 제 편집을 참조하십시오. – pad

+0

이러한 추가 힌트는 매우 유용했습니다. – user1742595

0

마지막으로 해결했습니다. "고급"것처럼 보이기 때문에 포기했습니다. 그러나 코드가 실제로 이해하기에 충분할만큼 간단 해졌습니다. 다시 Thx.

fun rev [] = [] 
    | rev (x::xs) = rev xs @ [x]; 

val test1rev1 = rev [1, 2, 3] = [3, 2, 1]; 


fun revrev [] = [] 
    | revrev (x::xs) = revrev xs @ [rev x]; 

val test1revop = revop [[1, 2], [3, 4, 5]] = [[5, 4, 3], [2, 1]];