2010-05-03 38 views
4

排序列表下面是排序任何列表代码: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的任何地方,也没有在代码

回答

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] 
+0

但我不明白“head :: tail”模式的含义。你能解释一下吗? – 2010-05-03 07:06:12

+1

类型列表是一种定义为具有两个构造函数的内置类型。一个是空列表'[]'。另一个是cons cell'::'。您所写的模式匹配与您可以为自己定义的类型编写的模式匹配没有区别,除了它们使用内置的0元构造函数[]和二进制::。 – 2010-05-03 07:52:11

+0

在'head :: tail'模式中,变量head代表列表的第一个元素,tail代表列表的其余部分。 – 2010-05-03 07:53:11

1

添加到什么帕斯卡尔说,列表类型被定义为:

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

这就是你正在匹配你的清单lst针对。

+0

嗨, 我仍然得到错误:http://www.easy-share.com/1910132443/Error.bmp 能否请你帮我找出原因? Regards, darkie – 2010-05-05 04:39:49

1

符号“|”是水平线符号,它不是l字符, - >是负号和更大的符号。我认为你在Inria的网站上复制并粘贴了一段代码。请检查并重写特殊符号。我测试了它,它运行良好。

0

头部和尾部不需要定义。他们与你给的'list'匹配。