List 返回仅在一个列表中出现的元素列表-SML
如果L1=[1,2,3,4,5]和L2[4,5,6,7,8],我想返回[1,2,3,5,7,8],这些元素只出现在一个列表中。我已经编写了一个函数,返回两个列表中出现的项目列表List 返回仅在一个列表中出现的元素列表-SML,list,sml,List,Sml,如果L1=[1,2,3,4,5]和L2[4,5,6,7,8],我想返回[1,2,3,5,7,8],这些元素只出现在一个列表中。我已经编写了一个函数,返回两个列表中出现的项目列表 fun exists x nil = false | exists x (h::t) = (x = h) orelse (exists x t); fun listAnd _ [] = [] | listAnd [] _ = [] | listAnd (x::xs) ys = if exists x ys t
fun exists x nil = false | exists x (h::t) = (x = h) orelse (exists x t);
fun listAnd _ [] = []
| listAnd [] _ = []
| listAnd (x::xs) ys = if exists x ys then x::(listAnd xs ys)
else listAnd xs ys
我要找的名单应该是L1@L2-列表L1和L2。我还发现了删除元素和删除重复项的函数。我多次尝试稍微更改remDup函数,以便它不会留下任何多次出现的项目的痕迹。无法让它工作。我不知道如何使用和组合所有这些功能,使其工作
fun delete A nil = nil
| delete A (B::R) = if (A=B) then (delete A R) else (B::(delete A R));
fun remDups nil = nil
| remDups (A::R) = (A::(remDups (delete A R)));
如果存在一个diff函数,其中diff xs ys返回xs中的所有元素,但不返回ys中的所有元素,则可以轻松实现listOr函数:
fun listOr xs ys = diff (xs@ys) (listAnd xs ys)
diff函数的编写方式与listAnd类似:
fun diff xs [] = xs
| diff [] _ = []
| diff (x::xs) ys = if exists x ys
then diff xs ys
else x::(diff xs ys)