我正在尝试在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 :))。但是,现在函数只输出一个空列表而不管输入...有人知道那里发生了什么吗?
答案 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)));;
目前没有largerthan
,smallerthan
,filter
或append
的定义,因此编译器不知道如何处理此问题。
重新排序代码,几个问题就会消失。