颠倒'列表 - > 'b列表但获取模式匹配并非详尽无遗

时间:2012-10-13 17:09:22

标签: sml

此作业来自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]

2 个答案:

答案 0 :(得分:3)

模式匹配并非详尽无遗,因为您只将空列表或列表与两个元素匹配。

我认为这个练习的目的是基于之前介绍过的revrev来实现rev。以下是一些提示:

  • 基本情况是空列表。你只需返回一个空列表。
  • 归纳案例与非空列表x::xs匹配。与rev的实施类似,您可以在revrev上致电xs并在结尾处进行x转换。这次您需要使用rev,以便x本身也可以反转。

修改

您的功能在一般情况下不起作用。我的意思是以下骨架:

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

其中x也是一个列表。由于此功能与rev非常相似,我希望您可以自己填写...

答案 1 :(得分: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]];