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