我目前正在使用一个函数,该函数以以下方式计算两个列表的差异。
示例: 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)
感谢您的回答。
答案 0 :(得分:1)
当list2
为空时,您将返回一个包含list1
的列表的列表(又称x
)。这告诉OCaml返回类型是输入列表包含的列表的列表。因此,当您稍后尝试仅返回简单的元组列表而不是返回元组列表时,OCaml认为这是错误的。
但是实际上您要返回一个元组列表。错误是在x, []
情况下返回列表列表。您可以通过将大小写更改为| x, [] -> x
或| _, [] -> list1
来解决此问题。