Связанный список Ocaml - PullRequest
       14

Связанный список Ocaml

4 голосов
/ 15 ноября 2009

Как мне создать связанный список для хранения моих данных в Ocaml? Я пытаюсь сделать односвязный список, однако у меня возникли проблемы с синтаксисом. Я просто хочу сделать модуль, чтобы просто получить 'a из связанного списка, вставить' a или удалить 'a.

У кого-нибудь есть идеи?

Спасибо, Фейсал Абид

Ответы [ 3 ]

8 голосов
/ 16 ноября 2009

Как сказал aneccodeal, в ocaml уже есть списки.

Однако, для вашего интереса, это то, как вы можете создать свой собственный список. Очевидно, вы бы никогда не использовали его в реальном приложении :) Если вы хотите иметь несколько деревьев, структура данных будет очень похожа.

exception Empty_list

type 'a my_list = Nil | List of 'a * 'a my_list

let head = function 
     Nil -> raise Empty_list
   | List(e,_) -> e;;

let tail = function
    Nil -> Nil
   | List(_,t) -> t

let l = List(1, List(4, List(8, Nil)));;

print_endline (string_of_int(head l));;

print_endline (string_of_int (head(tail l)));;
5 голосов
/ 16 ноября 2009

OCaml имеет встроенные списки:

Список целых чисел: [1; 2; 3; 4; 5] ;; возвращает: int list = [1; 2; 3; 4]

Список строк: [ «Это», «что», «другой»] ;; возвращает: string list = ["this"; "тот"; "Другой"]

Или вы можете использовать оператор cons :: для создания списков:

1 :: 2 :: 3 :: [] ;; возвращает: int list = [1; 2; 3]

Чтобы получить голову (первый элемент) списка:

List.hd [1; 2; 3]
возвращает 1

Чтобы получить хвост списка (все элементы после первого элемента)

List.tl [1; 2; 3] возвращает: int list = [2; 3] * 1 018 *

Кроме того, вы можете посмотреть, как списки реализованы в стандартной библиотеке OCaml, посмотрев:

[расположение установки для OCaml] /lib/ocaml/std-lib/list.ml

4 голосов
/ 15 ноября 2009

Разве у OCaml нет списков в качестве примитива? Я не занимался SML с колледжа, но, похоже, вспомнил head и tail примитивы. Я вижу, что другие люди реализовали настоящую структуру данных связанного списка, хотя ... посмотрите Список ссылок Дастина OCaml , например.

...