SML多集交点函数

时间:2017-04-09 01:41:56

标签: list functional-programming intersection sml

我需要在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])

但是这给了我一些类型不匹配的错误,并且无法正常工作。有人可以帮我或给我一些提示来编写这个功能吗?

谢谢!

1 个答案:

答案 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);;