OCaml-评估函数时出错(此表达式的类型为'a *'b,但应为类型为''a *'b)list#的表达式

时间:2018-08-16 13:35:35

标签: ocaml

我目前正在使用一个函数,该函数以以下方式计算两个列表的差异。

  1. 输入列表按类型'a的键的值进行排序。
  2. 结果包括第一个列表中的键对 不在第二个列表中。

示例: diff [(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)列表类型的表达式#

工作代码:

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)

感谢您的回答。

1 个答案:

答案 0 :(得分:1)

list2为空时,您将返回一个包含list1的列表的列表(又称x)。这告诉OCaml返回类型是输入列表包含的列表的列表。因此,当您稍后尝试仅返回简单的元组列表而不是返回元组列表时,OCaml认为这是错误的。

但是实际上您要返回一个元组列表。错误是在x, []情况下返回列表列表。您可以通过将大小写更改为| x, [] -> x| _, [] -> list1来解决此问题。