Manipulations de bases
type 'a list =
| []
| (::) of 'a * 'a list
:: est l'insertion en tête (gauche) de liste. On ne peut pas l'utiliser pour ajouter un élément à la fin (droite) de la liste. Les listes se manipulent uniquement depuis la gauche. Accèder à la droite demander de parcourir toute la liste, ce qui a une complexité linéaire par rapport au nombre d'éléments.
La définition des listes est inductive : elles se manipulent donc naturellement avec la combinaison récursion-filtrage par motif.
let rec my_function list = match list with
| [] -> ...
| first::others -> ...
| [single_elt] ->
| first::second::others ->
| [one;two;three] ->
| ...
Principales fonctionnelles
Le triumvirat qui règne sur les listes :
List.map f [e1;e2;e3;...;ek] ---> [f e1; f e2; f e3; ...; f ek]
List.filter predicat [e1;e2;e3;...ek] ---> [ei | predicat ei]
List.fold_left (++) neutral [e1;e2;...;ek]
---> (...((neutral ++ e1) ++ e2 ) ...) ++ ek
Pour compléter :
flatten [[a_1;...a_k];[b_1;...;k_l];...]
---> [a_1;a_2;...;a_k;b_1;b_2;...;b_l;c_1;...]
let rec bind list ~f =
list
|> List.map f
|> List.flatten
let (>>=) list f = bind list ~f
let product list1 list2 =
list1 >>= fun elt1 ->
list2 >>= fun elt2 ->
[(elt1,elt2)]
let res = product [1;2;3] [4;5]
Tester une liste
List.mem elt [e1;e2;...;ek]
---> elt = e1 || elt = e2 || ... || elt = ek
List.for_all predicat [e1;e2;...;ek]
---> predicat e1 && predicat e2 && ... && predicat ek
List.exists predicat [e1;e2;...;ek]
---> predicat e1 || predicat e2 || ... || predicat ek
Autres fonctions très utiles
List.length [a1;a2;...ak] ---> k
List.sort compare_op unsorted_list ---> sorted_list
List.combine [a1;a2;...;ak] [b1;b2;...;bk]
---> [(a1,b1);(a2,b2);...(ak,bk)]
List.split [(a1,b1);(a2,b2);...(ak,bk)]
---> ([a1;a2;...;ak],[b1;b2;...;bk])