我想创建一个反转mylist值的函数。我写了代码,但它没有用,我很感激任何提示或帮助。
数据类型代码:
datatype 'element mylist =
NIL
| CONS 'element * 'element mylist;
我写的函数是:
fun reverse NIL = NIL
| reverse (CONS(x, xs)) = CONS((reverse xs), x);
我还想编写一个附加2个mylist值的函数,我有一些情况但它没有用,我虽然如下:
fun append NIL = fn NIL => NIL
| append NIL = fn (CONS(x, xs)) => CONS(x, xs)
| append (CONS(x, xs)) = fn NIL => CONS(x, xs)
| append (CONS(x, xs)) = fn (CONS(y, ys)) => append xs (CONS(y, ys));
但它没有用,给我错误,我的代码出了什么问题?
由于
答案 0 :(得分:2)
反转列表的一种经典方法是使用尾递归辅助函数,如下所示:
fun helper accumulator NIL = accumulator
| helper accumulator CONS(x, xs) = helper CONS(x, accumulator) xs
现在反向就是:
val reverse = helper NIL
答案 1 :(得分:1)
在append
函数中,你犯了两个错误:
append NIL
和append (CONS(x, xs))
的重复模式匹配案例。fn NIL => ...
之类的lambda中的非详尽模式匹配。 append
的逻辑也不正确。它应该是这样的:
fun append NIL ys = ys
| append (CONS(x, xs)) ys = CONS(x, append xs ys)
函数reverse
出现类型不匹配错误。由于reverse xs
是列表,CONS(reverse xs, x)
不会键入检查。快速解决方法是使用append
来实施reverse
:
fun reverse NIL = NIL
| reverse (CONS(x, xs)) = append (reverse xs) (CONS(x, NIL))