我需要在SML中编写一个函数,该函数将任意数量的列表作为输入,并返回给定的所有集合的交集。例如,函数需要具有以下形式:
multiSetIntersection([s1,s2,s3,s4]) = (Intersection of s1,s2,s3,s4)
我已经能够编写两个列表的交集函数,如下所示:
fun intersec([], y) = []
| intersec(x::xs, y) =
if memberOf(x,y) then x::intersec(xs,y)
else intersec(xs,y)
但我无法概括"此函数将任意数量的列表作为输入。我尝试过以下方法:
fun multiSetIntersection([]) = []
| multiSetIntersection((x::xs)::y) =
if memberOf(x,y) then x::multiSetIntersection([xs,y])
else multiSetIntersection([xs,y])
但是这给了我一些类型不匹配的错误,并且无法正常工作。有人可以帮我或给我一些提示来编写这个功能吗?
谢谢!
答案 0 :(得分:1)
使用此交叉功能
fun intersect ([], _) = []
| intersect (x::xs, ys) =
if List.exists (fn y => x = y) ys
then x :: intersect (xs, ys)
else intersect (xs, ys)
要进行多组交集,有3种情况。
如果没有集合,则交叉点为[]
。
如果有一组xs
,那么交集就是那个。
如果有两组以上,则交集是第一组的intersect
和所有其余组的交集。
将这四个案例放在一起我们得到:
fun intersects [] = []
| intersects [xs] = xs
| intersects (xs::xss) = intersect (xs, intersects xss);;