OCaml-计算函数时出错(此表达式的类型为“a*”b,但表达式的类型应为(“a*”b)列表)

OCaml-计算函数时出错(此表达式的类型为“a*”b,但表达式的类型应为(“a*”b)列表),ocaml,Ocaml,我目前正在开发一个函数,它通过以下方式计算两个列表的差异 输入列表按“a”类型键的值排序。 结果包括第一个列表中带有键的对 未包含在第二个列表中的。 例如: 差异[1,2;2,3;4,5];5,6] [2,4;4,6] → [1,2;5,6] 现在我面临着错误,我无法解决 我的代码: let rec diff list1 list2= match list1,list2 with |x,[] -> [x] | [],_->[] | h1::t1,h2::t2 -> le

我目前正在开发一个函数,它通过以下方式计算两个列表的差异

输入列表按“a”类型键的值排序。 结果包括第一个列表中带有键的对 未包含在第二个列表中的。 例如: 差异[1,2;2,3;4,5];5,6] [2,4;4,6] → [1,2;5,6]

现在我面临着错误,我无法解决

我的代码:

let rec diff list1 list2= match list1,list2 with
|x,[] -> [x]
| [],_->[]
| h1::t1,h2::t2 ->
    let (k1,v1) = h1  in
    let (k2,v2)=h2 in
    if(k1=k2) then diff t1 t2
    else if (k1>k2) then h1::(diff list1 t2)
    else h2::(diff t1 list2) 
错误消息:

否则,如果k1>k2,则h1::diff list1 t2错误:此表达式具有 类型“a*”b 但表达式应为“a*”b列表类型

工作代码:

感谢您的回答。

当列表2为空时,您将返回包含列表1 a.k.a.x的列表。这告诉OCaml返回类型是输入列表所包含内容的列表列表。因此,当您稍后尝试只返回简单的元组列表,而不是元组列表时,OCaml认为这是错误的

但实际上,返回元组列表是您想要的。错误是在x、[]情况下返回列表列表。您可以通过将该大小写更改为| x,[]->x或| |,[]->list1来修复此问题

let rec diff list1 list2= match list1,list2 with
|_,[] -> list1
| [],_->[]
| h1::t1,h2::t2 ->
    let (k1,v1) = h1  in
    let (k2,v2)=h2 in
    if(k1=k2) then diff t1 t2
    else if (k1>k2) then h1::(diff list1 t2)
    else h1::(diff t1 list2)