反向功能和附加功能到自定义列表标准ml

时间:2012-03-29 19:15:34

标签: function append reverse sml ml

我想创建一个反转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));

但它没有用,给我错误,我的代码出了什么问题?

由于

2 个答案:

答案 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 NILappend (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))