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