Functional programming 在OCaml中实现快速排序:don';我不明白是什么';出什么事了?

Functional programming 在OCaml中实现快速排序:don';我不明白是什么';出什么事了?,functional-programming,ocaml,quicksort,Functional Programming,Ocaml,Quicksort,我试图在OCaml中实现快速排序算法,我认为我已经有了它,但它不会编译,我只是看不出它有什么问题。这是我的密码: 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

我试图在OCaml中实现快速排序算法,我认为我已经有了它,但它不会编译,我只是看不出它有什么问题。这是我的密码:

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);; 
让rec快速排序列表=
匹配列表
[] -> []
|h::t->append((快速排序(筛选器)(大于h)
t) )(快速排序(过滤器(比h)t小);;
让大于xy的=
xy;;
让rec追加xy=
将x与
[]->y
|h::t->h::追加t y;;
让rec筛选f列表=
匹配列表
[] -> []
|h::t->(如果f h=true,则h::filter f t else filter f t);;
现在,当我尝试在OCaml中使用它时,它会说“错误:这个表达式的类型为'a->'b 但是,当指向快速排序函数的最后一行时,需要一个类型为“a”的表达式

有人知道出了什么问题吗

非常感谢

莱纳斯


编辑:好的,我已经摆脱了原来的错误(多亏了熟练的:)。但是,现在函数只输出一个空列表,而不考虑输入。。。有人知道那里发生了什么吗?

你在“申请”电话中有额外的参数。而不是:

追加((快速排序(筛选器)(大于h) t) )(快速排序(过滤器(比h)t小))

写下:

附加(快速排序(过滤器(大于h)t)) (快速排序(过滤器(小于h)t))


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

自上而下地编写代码,结果如下:

let rec quicksort list =
    match list with
    [] -> []
    |h::t -> append((quicksort (filter (largerthan h)
    t))(quicksort(filter (smallerthan h) t)));;
此时没有大于、
小于
过滤器
附加
的定义,因此编译器不知道如何处理


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

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

或者更好的做法是:
让左=快速排序(过滤器(大于h)t)在让右=快速排序(过滤器(小于h)t)在追加左-右
(有正确的行尾,我不确定我是否可以在评论中添加;这看起来更可读)谢谢!这解决了错误。但是,我现在只得到一个空列表作为输出…有人知道哪里出了问题吗?:)你需要将“largetthan”和“smallerthan”转换为“largerthan”和“smallerorequalthen”:否则,没有包含“h”的子列表。另请注意:尽可能使用标准库中的方法或标准库的一些良好替代品(如电池)<代码>过滤器和
附加
已经存在。嘿,谢谢你的解释。但是,我刚刚将函数按此顺序放在这里,在我的源文件中,顺序是正确的:)。好的。始终给出显示问题的代码,以避免在您给出的代码有其他问题时混淆他人。您不需要大于,只需使用(<)(与参数一起使用)。smallerthan(使用(>)也是如此。请注意,这实际上不是一个快速排序,因为append速度很慢(列表的第一部分将构建两次…)。请注意,
append
filter
在基本库中已经可用,如
(@)
(中缀运算符,
xs@yx
)和
列表。分别筛选