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

使用OCaml在两个列表中查找没有重复项的公共元素,ocaml,Ocaml,我试图在OCaml中实现rec函数,但我不知道如何过滤结果列表中重复的公共元素,以下是我的实现: let rec common twolists = match twolists with | (x, y) -> match x with | [] -> [] | s :: ss -> if memberof (s, y) then s :: com

我试图在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)
;;

我在两个列表中找到了所有的公共元素,但我不知道如何在没有任何重复项的情况下进行操作。

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

s :: common (ss, y)
有点复杂

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

为此,您可能需要使用
let

let rest = common (ss, y) in
. . .
(请注意,如果这是列表可能变长的生产代码,您可能希望避免重复调用
memberof
。您可能最终使用树,即集合。然后结果是一个完全直接的集合交集。)