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

模式匹配并不详尽,因为您只匹配空列表或具有两个元素的列表。

我认为练习的目的是在之前介绍revrev的基础上实施。rev这里有一些提示:

  • 基本情况是空列表。您只需返回一个空列表。
  • 归纳案例匹配一个非空列表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 回答