2

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

但它不起作用,给我错误,我的代码有什么问题?

谢谢

4

2 回答 2

3

反转列表的经典方法是使用尾递归辅助函数,如下所示:

fun helper accumulator NIL = accumulator
  | helper accumulator CONS(x, xs) = helper CONS(x, accumulator) xs

现在反向很简单:

val reverse = helper NIL
于 2012-03-30T04:01:57.247 回答
2

append功能上,你犯了两个错误:

  • append NIL和的重复模式匹配案例append (CONS(x, xs))
  • fn NIL => ...lambda of等中的非穷举模式匹配。

的逻辑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))
于 2012-03-29T19:27:03.227 回答