【问题标题】:Implementing quicksort in OCaml: don't understand what's going wrong?在 OCaml 中实现快速排序:不明白出了什么问题?
【发布时间】:2011-11-09 11:16:35
【问题描述】:

我正在尝试在 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);; 

现在,当我尝试在 OCaml 中使用它时,它显示“错误:此表达式的类型为 'a -> 'b 但是在指向我的快速排序函数的最后一行时,需要一个类型为“a”的表达式。

有人知道怎么回事吗?

非常感谢!

莱纳斯

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

【问题讨论】:

  • 您不需要大于,只需使用 ( ))也是如此。
  • 还要注意,这并不是真正的快速快速排序,因为追加速度很慢(列表的第一部分将构建两次......)
  • 另请注意,appendfilter 已在基础库中可用,分别为 (@)(中缀运算符,xs @ yx)和 List.filter

标签: functional-programming ocaml quicksort


【解决方案1】:

您在“应用”调用中有额外的括号。而不是:

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

这样写:

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

【讨论】:

  • 或者更好的是:let left = quicksort (filter (largerthan h) t) in let right = quicksort (filter (smallerthan h) t) in append left right(带有正确的行尾,我不确定我可以在评论中添加;这看起来更具可读性)
  • 谢谢!这解决了错误。但是,我现在只得到一个空列表作为输出......有人知道那里出了什么问题吗? :)
  • 你需要把'largetthan'和'smallerthan'变成'largerthan'和'smallerorequalthen':)否则没有包含'h'的子列表
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    从上到下查看您的代码,会发生以下情况:

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

    此时还没有largerthansmallerthanfilterappend的定义,所以编译器不知道该怎么处理。

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

    【讨论】:

    • 另请注意:尽可能使用标准库中的方法或标准库的一些好的替代品(例如电池)。 filterappend 已经存在。
    • 嘿,谢谢你的解释。但是,我只是把函数按这个顺序放在这里,在我的源文件中顺序是正确的:)。
    • 好的。始终给出显示问题的代码,以免在您给出的代码有其他问题时混淆其他人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多