删除SML列表



我正试图编写一个函数从另一个列表中删除列表。

''a list -> ''a list -> ''a list

到目前为止我写的是:

fun delete  _ [] = [] | 
    delete (h1::t1) (h2::t2) = 
     if h1=h2
     then t2
     else h2::delete (h1::t1) t2;

我正在使用MoscowML,它给我一个警告:模式匹配不是详尽的错误。

上述函数的检验:

- delete [4,5] [1,2,3,4,5,6,7,8];
> val it = [1,2,3,5,6,7,8] : int list

期望的输出是:

> val it = [1,2,3,6,7,8] : int list

有两个问题:

1-为什么解释器抛出警告:模式匹配不是详尽的错误

2-如何使代码正常工作

关于第一点,警告的原因是因为你没有检查可能发生的每一种可能性。函数delete目前只检查两种可能性:

-1第二个列表是空列表(由模式:_ [] =覆盖)

-2两个列表都不为空(被第二个模式覆盖:(h1::t1) (h2::t2) =)

然而,还有第三种可能,即第一个列表是空列表。因此,以下输入将导致错误:delete [] [1,2,3,4,5,6]

关于第二点,如果确切的要求是从第二个列表中连续删除第一个列表中的元素,并且只删除一次,那么您的解决方案非常接近。else分支很好,只有then分支需要更多的关注。通过纠正then分支,我得到以下结果:

delete [4,5] [1,2,3,4,5,6,7,8] = [1,2,3,6,7,8];
delete [5,4] [1,2,3,4,5,6,7,8] = [1,2,3,4,6,7,8];
delete [4,4,5] [1,2,3,4,5,6,7,8] = [1,2,3,5,6,7,8];
delete [4,5,6] [1,2,3,4,5,6,7,8] = [1,2,3,7,8];
delete [4,6,5] [1,2,3,4,5,6,7,8] = [1,2,3,5,7,8];
delete [4,6,5] [1,2,3,4,6,7,8,5] = [1,2,3,7,8];

但是,如果您想删除第一个列表中出现在第二个列表中的所有元素,而不管它们的顺序如何,那么您需要重新考虑您的方法。

例如

,如果您想要以下结果:

delete [4,6,5] [1,2,3,4,4,5,5,5,4,4,6,6,5,5,6,6,6,6,6,7,8,5] = [1,2,3,7,8];

则需要分两步完成:首先编写一个函数del,给定一个元素,它将删除列表中出现的所有元素:fun del e l = ...它的实现实际上与您为delete提供的实现相同,只是您需要稍微更改then分支。

在你有了del之后,现在你可以实现函数delete,给定一个列表,它将删除第二个列表中该列表的所有出现。这里您将使用前面定义的函数del

最新更新