合并排序程序

时间:2017-08-26 11:39:21

标签: ocaml

我正在尝试在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中的所有分支都返回相同类型的列表。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

您的代码中有几个问题:

  • 正如评论中所提到的,merge函数有3个参数,但你用2调用它,
  • mergesort函数以递归方式调用,但未声明rec ursive。

这是一个existing implementation