返回Ocaml中两个列表中的公共元素

返回Ocaml中两个列表中的公共元素,ocaml,Ocaml,作为赋值问题的一部分,我需要实现一种方法来返回两个列表中的公共元素: 我的想法是删除两个列表中的重复项,将它们连接起来,并返回结果列表中重复的元素。我想定义一个布尔函数,用于检查列表中的每个元素是否多次出现。我的想法是使用List.fold_left和列表中的特定元素b,并使用acc跟踪它在列表中出现的次数。但是,我在这里有一个错误: 我有另一个想法,首先对列表进行排序,但是列表可以是任何类型,因此也必须对新类型进行比较。或者我可以使用

作为赋值问题的一部分,我需要实现一种方法来返回两个列表中的公共元素: 我的想法是删除两个列表中的重复项,将它们连接起来,并返回结果列表中重复的元素。我想定义一个布尔函数,用于检查列表中的每个元素是否多次出现。我的想法是使用List.fold_left和列表中的特定元素b,并使用acc跟踪它在列表中出现的次数。但是,我在这里有一个错误:

我有另一个想法,首先对列表进行排序,但是列表可以是任何类型,因此也必须对新类型进行比较。或者我可以使用<来比较任何类型的值吗

以下是我目前掌握的代码

let rec remove (b : 'a) (l : 'a list)=
  match l with
  | [] -> []
  | w::e -> if w=b then remove b e
      else w::(remove b e)

let rec removeduplicates (l:'a list)=
  match l with 
  | [] -> []
  | w::e -> w::(removeduplicates(remove w e))

let removeduppair (l : 'a list * 'a list)=
  let (l1,l2) = l in
  (removeduplicates l1, removeduplicates l2)

此表达式存在类型错误:

if x = b then acc + 1
问题是没有
else
部件。换句话说,当x不等于b时,它没有说明你想要的值是什么

您只需添加一个
else
部件即可解决此问题


更详细一点:OCaml允许您省略
else
部分,但前提是
then
部分具有单位类型。在这种情况下,测试为假时的值将与测试为真时的值相同,即
()
(单元类型的唯一值)。

此表达式有一个类型错误:

if x = b then acc + 1
问题是没有
else
部件。换句话说,当x不等于b时,它没有说明你想要的值是什么

您只需添加一个
else
部件即可解决此问题


更详细一点:OCaml允许您省略
else
部分,但前提是
then
部分具有单位类型。在这种情况下,测试为假时的值将与测试为真时的值相同,即
()
(单元类型的唯一值)。

这将非常缓慢
O(n^2)
,并受到堆栈大小的限制。为了提高效率,您有两个选择:1)如您所述:排序。这将是
O(n log n)
。或者2)散列<代码>O(n)。使用列表中的项作为键(和()作为值)创建Hashtbl,然后检查第一个中的键是否也在第二个中。这将非常慢
O(n^2)
,并且受堆栈大小的限制。为了提高效率,您有两个选择:1)如您所述:排序。这将是
O(n log n)
。或者2)散列<代码>O(n)。使用列表中的项作为键(和()作为值)创建Hashtbl,然后检查第一个中的键是否也在第二个中。