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

List SML:从另一个列表中减去一个列表,list,sml,subtraction,List,Sml,Subtraction,从一个列表中减去另一个列表最简单的方法是什么?我是否需要使用ListPair来解决此任务?请注意,我需要比较行,而不是单个元素。例如,有两个列表“L1”和“L2”: 我需要通过应用L3=L2-L1获得“L3”: L3 = [(3, 2, 3)] 谢谢。根据我对问题的理解,您希望删除L2中也在L1中的元素,但每次仅删除一次 一个简单的解决方案可能涉及一个helper函数来告诉您是否在L1中找到了一个元素,以及删除了该元素的L1的其余部分 fun remFirst _ [] rest = (fa

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

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

L3 = 
[(3, 2, 3)]

谢谢。

根据我对问题的理解,您希望删除L2中也在L1中的元素,但每次仅删除一次

一个简单的解决方案可能涉及一个helper函数来告诉您是否在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)
更新:问题现在已被修改

如果现在需要从L2中删除L1中的元素,那么过滤器是有用的

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

您是否希望从L2中删除同样在L1中的元素,但在L1中每次仅删除一次?如果L1不是L2的前缀,您打算做什么?这是正确的。但可能存在多次出现,也应该删除。但是在您的示例中,您没有删除L2中多次出现的3和2。您说应该删除多次出现,但是您的示例包含多次出现的2和3,您将其保留。您的示例目前只删除了前缀。谢谢,但我需要比较行,而不是列表中的单个元素。您的问题从未提到元组列表,但很好,我将调整我的答案。不过,请尽量说得更准确些。@Sarah在看您的问题时,最好定义列表的列表类型,以避免出现多相等警告。
List.filter (fn x => List.all (fn y => x <> y) L1) L2