我在SML中有一个返回嵌套列表的函数:
[["A", "B", "C"], ["A", "B"], ["B", "C"]]]
是否可以提取出现在这些列表中的元素?即输出“B”?
我尝试了List.filter (fn y=>(fn x=> x=y)) lst
的效果,但无济于事......
任何提示?
答案 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