2010-05-03 1 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 

Может кто-нибудь, пожалуйста, помогите мне понять проблему здесь? Я не нашел head или tail быть предопределены в любом месте, ни в коде

ответ

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». Не могли бы вы объяснить? –

+1

Список типов - это встроенный тип, имеющий два конструктора. Один из них - пустой список '[]'. Другая - ячейка cons '::'. Написанные вами сопоставления шаблонов ничем не отличаются от совпадений шаблонов, которые вы могли бы написать для типов, которые вы определили бы сами, за исключением того, что они используют встроенный 0-арный конструктор [] и binary ::. –

+0

В шаблоне 'head :: tail' переменная' head' представляет первый элемент списка, а 'tail' - остальную часть списка. –

1

Добавление к тому, что сказал Паскаль, тип списка определяется как:

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

и вот что вы соответствуете по вашему списку lst против.

+0

Привет, я все еще получаю ошибку: http://www.easy-share.com/1910132443/Error.bmp Можете ли вы помочь мне найти причину? С уважением, darkie –

1

Символ "|" - это символ горизонтальной линии, это не символ l, а символ -> минус и символ большего размера. Я думаю, вы скопировали и вставили сегмент кода на веб-сайт Inria. Проверьте и перепишите специальные символы. Я тестировал его, и он работает хорошо.

0

Голова и хвост не должны определяться. Они сопоставляются с «списком», который вы даете.