SML:从另一个列表中减去一个列表

时间:2011-12-20 18:59:15

标签: list sml subtraction

从另一个列表中减去一个列表的最简单方法是什么?我是否需要使用ListPair来解决此任务?我需要比较ROWS,而不是单个元素。例如,有两个列表“L1”和“L2”:

L1 = 
[(1, 2, 3), 
(4, 5, 6)]

L2 = 
[(1, 2, 3), 
(4, 5, 6),  
(3, 2, 3]

我需要通过应用L3 = L2-L1获得“L3”:

L3 = 
[(3, 2, 3)]

感谢。

1 个答案:

答案 0 :(得分:2)

据我所知,你想要删除L2中也在L1中的元素,但每次只发生一次。

一个简单的解决方案可能需要一个辅助函数来告诉你是否在L1中找到了一个元素,以及删除了该元素的L1的其余部分。

fun remFirst _ [] rest = (false, rev rest)
  | remFirst x (y::ys) rest =
    if x = y then
        (true, rev rest @ ys)
    else
        remFirst x ys (y :: rest)

现在你可以迭代L2,每次remFirst返回true时丢弃元素,然后继续执行列表的其余部分。

如果您想要删除L2与L1共有的前缀,事情会变得更简单。

fun remPref [] _            = []
  | remPref xs []           = xs
  | remPref (x::xs) (y::ys) = if x = y then remPref xs ys else (x::xs)

更新:问题现已改变。

如果现在要求从L1中删除L1中的元素,则过滤器很有用。

List.filter (fn x => List.all (fn y => x <> y) L1) L2