从一个列表中删除另一个

Deleting one list from another

我正在尝试编写一个程序来删除 list1(如果它在 list2 中)。

例如

delete [1,2] [1,2,3,4]
  => [3,4]

我非常接近解决它,但我的代码只从第二个列表中删除第一个列表的头部,所以...

delete [1,2] [1,2,3,4]
  => [2,3,4]

如果有人能提供帮助,那就太好了:)

fun delete (hd1::tl1) [] = []
  | delete (hd1::tl1) (hd2::tl2) = 
      if hd1 = hd2 then delete (hd1::tl1) tl2 else hd2::delete(hd1::tl1) tl2;

取列表之间的析取;

A-[1,2]B-[1,2,3,4] list(set(A) - set(B)) which returns [3,4]

然后列出理解;

diff = [3,4] [x for x in B if x not in diff]

您需要确定整个第一个列表是否是第二个列表的开始。

并且您想在以前所做的基础上再接再厉 - 当您学习时,通常情况下您最近做了一些有用的事情。

给定一个函数 start 来确定一个列表是否是另一个列表的开始,你可以这样写

fun delete xs ys = if start xs ys
                   then <...>
                   else (hd ys) :: (delete xs (tl ys))

有趣的部分留作练习(你几乎肯定已经看到了可以使用的库函数)。