在OCaml中对列表进行排序

时间:2010-05-03 06:42:41

标签: ocaml

以下是排序任何给定列表的代码:

let rec sort lst =
   match lst with
     [] -> []
   | head :: tail -> insert head (sort tail)
 and insert elt lst =
   match lst with
     [] -> [elt]
   | head :: tail -> if elt <= head then elt :: lst else head :: insert elt tail;;

[来源:Code

但是,我收到一个未绑定的错误:

Unbound value tail
# let rec sort lst =
   match lst with
     [] -> []
   | head :: tail -> insert head (sort tail)
 and insert elt lst =
   match lst with
     [] -> [elt]
   | head :: tail -> if elt <= head then elt :: lst else head :: insert elt tail;;
Characters 28-29:
     | head :: tail -> if elt <= head then elt :: lst else head :: insert elt tail;;
     ^
Error: Syntax error

有人可以帮我理解这里的问题吗?我没有找到headtail在任何地方或代码中预定义

4 个答案:

答案 0 :(得分:2)

您的代码似乎正确,并为我编译:

    Objective Caml version 3.11.1

# let rec sort lst = ...

val sort : 'a list -> 'a list = <fun>
val insert : 'a -> 'a list -> 'a list = <fun>

# sort [ 1 ; 3 ; 9 ; 2 ; 5 ; 4; 4; 8 ; 4 ] ;;
- : int list = [1; 2; 3; 4; 4; 4; 5; 8; 9]

答案 1 :(得分:1)

除了Pascal所说的,列表类型定义为:

type 'a list = [] | :: of 'a * 'a list

这就是您与列表lst匹配的内容。

答案 2 :(得分:1)

符号“|”是水平线符号,它不是l字符和 - &gt;是减号和更大的符号。我想你在Inria的网站上复制并粘贴了一段代码。请检查并重写特殊符号。我测试了它,效果很好。

答案 3 :(得分:0)

不需要定义头部和尾部。它们与您提供的“列表”匹配。