2010-05-03 37 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'匹配。