从SML中的嵌套列表中提取重复项

时间:2013-02-11 07:28:26

标签: list duplicates sml duplicate-removal smlnj

我在SML中有一个返回嵌套列表的函数:

[["A", "B", "C"], ["A", "B"], ["B", "C"]]]

是否可以提取出现在这些列表中的元素?即输出“B”?

我尝试了List.filter (fn y=>(fn x=> x=y)) lst的效果,但无济于事...... 任何提示?

1 个答案:

答案 0 :(得分:1)

我假设您给出的示例嵌套列表具有代表性,即元素是唯一且有序的。我还会省略任何显式类型或参数化比较函数,因此函数将对整数而不是字符串进行操作。

首先,将问题分解为成对比较列表。定义辅助函数common以查找一对有序列表的公共元素。它看起来像这样:

fun common(xs, []) = []
  | common([], ys) = []
  | common(x::xs, y::ys) = if x=y then x::common(xs, ys) 
                           else if x < y then common(xs, y::ys) 
                           else common(x::xs, ys)

类型为int list * int list -> int list

要使这项工作适用于嵌套列表,您可以在common上建立解决方案,方法如下:

fun nested_common([]) = []
  | nested_common(x::[]) = x
  | nested_common(x::y::rest) = nested_common(common(x,y)::rest)

此类型为int list list -> int list

投入使用(在莫斯科ML):

- nested_common [[1,2,3], [1,2], [2,3]];
> val it = [2] : int list