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

时间:2019-01-26 17:34:38

标签: ocaml

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

我还有另一个想法,涉及首先对列表进行排序,但是列表可以是任何类型,因此还必须对新类型进行比较。还是可以只使用<比较任何类型的值?

这是我到目前为止的代码。

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)

1 个答案:

答案 0 :(得分:2)

此表达式的类型错误:

if x = b then acc + 1

问题是没有else部分。换句话说,当x不等于b时,它并没有说您想要的值是什么。

您只需添加else部分即可解决此问题。

更多细节:仅当else部分具有单位类型时,OCaml允许您省去then部分。在这种情况下,测试为假时的值将与为真时的值相同,即()(单位类型的唯一值)。