Nous avons discuter des façons de manipuler et transformer des listes, mais hormis par construction explicite nous ne savons pas en créer. En fait très fréquemment, les listes proviendront de fonctions dans diverses librairies. Dans l'exemple du comptage des fichiers sources, nous avons utilisé Sys.ls_dir pour lister les éléments d'un répertoire. Les listes sont une structure très standard en OCaml et les fonctions retournant des collections de valeurs le font en général en retournant des listes.
Le module List de la librairie standard ne fournit pas de fonction permettant de créer des listes à partir de rien (depuis OCaml 4.06.0 , List.init fait partie de la librairie standard). Core.Std.List en propose deux.
range permet de créer la liste de tous les entiers entre deux bornes.
Les arguments optionnels permettent de paramétrer plus finement la fonction. ~start et ~stop permettent de préciser si la borne minimum (~start) et la borne maximum (~stop) doivent être incluses (`inclusive) ou exclues (`exclusive). ~stride:k permet d'aller de $k$ en $k$ en partant du minimum.
init construit une liste d'une longueur donnée, la valeur du $i$e élément est donné par une fonction.
Toutes les fonctions que nous avons vu sont fondamentales pour la manipulation des listes. Mais il nous en manque encore quelques unes.
List.sort, List.stable_sort permettent de trier une liste (la deuxième version garantit que le tri est stable : l'ordre relatif d'éléments égaux n'est pas modifié). La fonction prend en argument la fonction de comparaison.
Core.Std.List.zip = List.combine prend deux listes de même longueur et en crée une seule de même longueur, donc le $i$e élément est la paire du $i$e élément de la première liste avec le $i$e élément de la deuxième liste.
La fonction n'est pas définie si les listes n'ont pas la même longueur, elle provoquera donc une erreur à l'exécution dans ce cas. La fonction inverse, prenant une liste de paires et retournant une paire de listes, s'appelle List.split = Core.Std.List.unzip.
zip, c'est la fermeture éclair en anglais.
nth permet de récupérer le $i$e élément d'une liste (commençant à l'indice 0). length retourne la longueur de la liste. On a donc :
map, fold_left, exists et les autres fonctionnelles de listes ont des versions map2, fold_left2, exists2, qui permettent d'appliquer une fonction prenant deux arguments, un dans chaque liste. C'est équivalent à utiliser zip, puis la fonctionnelle usuelle.