我正在尝试在OCaml中编写一个简单的合并排序代码,它也删除了重复项。
我写的代码是:
let mergesort l r =
match l with
[] -> []
| [x]-> [x]
| x::xs -> let rec split l3 =
match l3 with
[] -> ([], [])
| [h] -> ([h], [])
| h1::h2::t -> let (left, right) = split t in
(h1::left, h2::right) in
let rec merge l1 l2 r =
match (l1, l2) with
([], []) -> []
| ([a], []) -> [a]
| ([], [a]) -> [a]
| (a1::t1, a2::t2) -> if a1 = a2 then (a1::(merge (t1) t2))
else if r(a1, a2) then (a2::(merge t1 (a2::t2)))
else (a1::(merge (a1::t1) t2)) in
let (l3, l4) = split l in
merge (mergesort l3 r) (mergesort l3 r) r;;
我在合并函数中遇到以下类型错误:
|(a1 :: t1,a2 :: t2) - >如果a1 = a2那么
(a1::( merge(t1)t2))
错误:此表达式的类型为' a - > ' b列表 但是表达式是' b列表
我不知道为什么我收到此错误,因为merge中的所有分支都返回相同类型的列表。
有人可以帮忙吗?
答案 0 :(得分:1)
您的代码中有几个问题:
merge
函数有3个参数,但你用2调用它,mergesort
函数以递归方式调用,但未声明rec
ursive。