使用OCaml在两个列表中查找没有重复的公共元素

时间:2019-01-30 00:30:25

标签: ocaml

我正在尝试在OCaml中实现rec函数,但是我不知道如何过滤结果列表中重复的公共元素,这是我的实现:

let rec common twolists =
    match twolists with
    | (x, y) ->
         match x with
         | [] -> []
         | s :: ss ->
             if memberof (s, y) then
                 s :: common (ss, y)
             else 
                 common (ss, y)
;;

我在2个列表中找到了所有常见的元素,但是我不知道该如何做而不重复。

1 个答案:

答案 0 :(得分:1)

一个想法是替换此表达式:

s :: common (ss, y)

有些复杂。

如果s已经是common (ss, y)的成员,则您不想再次添加它。因此,可以根据是否存在s来用两种情况替换此表达式。

为此,您可能需要使用let

let rest = common (ss, y) in
. . .

(请注意,如果这是生产代码,列表可能会很长,那么您可能要避免重复调用memberof。您可能最终会使用树。例如,集合。结果是一个完全简单的集合交集。)