在OCaml中实现快速排序:不明白出了什么问题?

时间:2011-11-09 11:16:35

标签: functional-programming ocaml quicksort

我正在尝试在OCaml中实现quicksort算法,我想我已经拥有它,但它不会编译,我只是看不出它有什么问题。这是我的代码:

let rec quicksort list =
    match list with
    [] -> []
    |h::t -> append((quicksort (filter (largerthan h)
    t))(quicksort(filter (smallerthan h) t)));;

let largerthan x y =
    x<y;;

let smallerthan x y =
    x>y;;

let rec append x y =
match x with
[] -> y
| h::t -> h:: append t y;;  

let rec filter f list =
   match list with
   [] -> []
   |h::t -> (if f h = true then h:: filter f t else filter f t);; 

现在,当我尝试在OCaml中使用它时,它会显示“错误:此表达式的类型为'a - &gt;'b        但是在指向我的快速排序功能的最后一行时,表达式'a'是预期的。

有人知道出了什么问题吗?

非常感谢!

莱纳斯

编辑:好的,我已经摆脱了原始错误(感谢ADEpt :))。但是,现在函数只输出一个空列表而不管输入...有人知道那里发生了什么吗?

3 个答案:

答案 0 :(得分:3)

你在&#34;申请&#34;呼叫。而不是:

  

追加((快速排序(过滤(大)h)      t))(quicksort(filter(smallerthan h)t))

写下这个:

  

追加(快速排序(过滤(大于h)t))            (quicksort(filter(smallerthan h)t))

答案 1 :(得分:1)

对于您的“第二个”问题:您忘记将h添加到排序列表....

答案 2 :(得分:0)

OCaml按照您传递的顺序编译您的程序。对此非常严格。如果你使用了某些东西,你需要在使用它之前给它。如果替换定义,之后将使用新定义,但在此之前使用旧定义。

自上而下的代码,这就是:

let rec quicksort list =
    match list with
    [] -> []
    |h::t -> append((quicksort (filter (largerthan h)
    t))(quicksort(filter (smallerthan h) t)));;

目前没有largerthansmallerthanfilterappend的定义,因此编译器不知道如何处理此问题。

重新排序代码,几个问题就会消失。