作为分配问题的一部分,我需要实现一种方法以返回两个列表中的公共元素: 我的想法是删除两个列表中的重复项,将它们连接起来并返回在结果列表中重复的元素。我想定义一个布尔函数,用于检查列表中的每个元素是否出现多次。我的想法是将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)
答案 0 :(得分:2)
此表达式的类型错误:
if x = b then acc + 1
问题是没有else
部分。换句话说,当x不等于b时,它并没有说您想要的值是什么。
您只需添加else
部分即可解决此问题。
更多细节:仅当else
部分具有单位类型时,OCaml允许您省去then
部分。在这种情况下,测试为假时的值将与为真时的值相同,即()
(单位类型的唯一值)。