0

この割り当てはInduction to Programming using sml 5.14

これが私のコードですが、ベースケースではパターンマッチングが完全ではありませんというメッセージが表示されます..

fun revrev [] = [[], []]
  | revrev [x::xs,y::ys] = revrev[ys@[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]
4

2 に答える 2

3

空のリストまたは 2 つの要素を持つリストのみを照合するため、パターン マッチングは網羅的ではありません。

演習の意図は、以前に紹介したものrevrevに基づいて実装することだと思います。revいくつかのヒントを次に示します。

  • 基本ケースは空のリストです。空のリストを返すだけです。
  • 帰納的な場合は、空でない list に一致しますx::xs。の実装と同様に、最後にrevを呼び出しrevrevxs変換を行うことができますx。今回はそれ自体も逆にrevなるように使用する必要があります。x

編集:

あなたの機能は一般的なケースでは機能しません。私が意味したのは、次のスケルトンです。

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

wherexもリストです。この機能は とよく似ているので、自分revで記入していただければと思い...ます。

于 2012-10-13T18:18:09.810 に答える
0

ようやく解決しました...「進んだように見えた」ので諦めていましたが、実際にコードがわかりやすいほどシンプルになったとき。もう一度。

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]];
于 2012-10-14T04:32:54.820 に答える