ocaml:List

Un article de Polydoc.

Sommaire

[modifier] Description

Certaines fonctions sont dites non récursives terminales (tail-recursive). Une fonction tail-rec utilise un espace de pile constant tandis qu'une fonction non tail-rec utilise un espace de pile proportionnel à la longueur de la liste passée en argument, ce qui peut poser problème avec de très longues listes. Quand la fonction prends plusieurs listes en argument un formule donnant approximativement l'espace pile utilisé (dans une unité non spécifié :S) est affichée entre parenthèses. L'indication ci-dessus peut néanmoins être ignorée si la liste comporte moins de 10000 éléments.

[modifier] Fonctions

[modifier] length

'a list -> int

Retourne le nombre d'élément de la liste passé en argument.

[modifier] hd

'a list -> 'a

Retourne le premier élément de la liste.

[modifier] tl

'a list -> 'a list

Retourne la liste sans son premier élément.

[modifier] nth

'a list -> int -> 'a

Retourne l'élément d'index n de la liste, sachant que le premier élément de la liste est à la position zéro et le dernier à length-1.

[modifier] rev

'a list -> 'a list

Renvoie l'inverse de la liste passée en argument.

Exemple :
# List.rev [1;2;3];;
- : int list = [3;2;1]

[modifier] append

'a list -> 'a list -> 'a list

Ajoute une élément à une autre liste.

/!\ Attention : Cette fonction n'est pas tail-rec Cette fonction est similaire à l'opérateur @ qui n'est pas non plus tail-rec.

Exemple :
# List.append [1;2;3] [4;5;6];;
- : int list = [1;2;3;4;5;6]

[modifier] rev_append

'a list -> 'a list -> 'a list

Cette fonction ajoute l'inverse de la premier liste passée en argument et l'ajoute à la deuxième, cette fonction est similaire à List.rev l1 @ l2 mais est tail-rec et a un meilleur rendement.

[modifier] concat

'a list list -> 'a list

Concaténe une liste de lists. Les éléments de l'argument sont tous concaténés dans le même ordre pour donner le résultat. Concatenate a list of lists. The elements of the argument are all concatenated together (in the same order) to give the result. Cette fonction n'est pas tail-rec (taille de l'argument + taille de la sous-liste la plus longue).

Exemple :
# List.concat [[1;2;3];[4;5];[6;7;8;9]];;
- : int list [1;2;3;4;5;6;7;8;9]

[modifier] flatten

'a list list -> 'a list

Identique à concat.

[modifier] iter

('a -> unit) -> 'a list -> unit

List.iter f \[a1; ...; an\] applique la fonction f à tous les éléments de la liste en commençant par a1 et en finissant par an. C'est équivalent à begin f a1; f a2; ...; f an; () end.

[modifier] map

('a -> 'b) -> 'a list -> 'b list

De même qu'iter cette fonction applique une fonction à chaque élément de la liste mais elle retourne le résultat sous forme de liste. Cette fonction n'est pas tail-rec. __Exemple :__ # List.map (fun x->x*2) [1;2;3];; - : int list [2;4;6]

[modifier] rev_map

('a -> 'b) -> 'a list > 'b list

Cette fonction est identique à List.rev (List.map f \[a1; ...; an\]) mais elle est tail-rec et a un meilleur rendement.

[modifier] fold_left

('a -> 'b -> 'a) -> 'a -> 'b list -> 'a List.fold_left f a \[b1; ...; bn\] est en fait : f (... (f (f a b1) b2) ...) bn.

Exemple :
# List.fold_left (fun x -> fun y -> x+y) 1 [1;2;3];;
- : int = 7

[modifier] fold_right

('a -> 'b -> 'b) -> 'a list -> 'b -> 'b

List.fold_right f \[a1; ...; an\] b est en fait f a1 (f a2 (... (f an b) ...)). Cette fonction n'est pas tail-rec.

Exemple :
# List.fold_right (fun x -> fun y -> x+y) [1;2;3] 1;;
- : int = 7

Vous pouvez donc vous demander : où est la différence entre fold_left et fold_right et bien en fait prenez l'exemple suivant et vous comprendrez que l'ordre d'évaluation des éléments est important :

# List.fold_left (-) 1 [1;2;3];;
- : int = -5
# List.fold_right (-) [1;2;3] 1;;
- : int = 1

[modifier] iter2

('a -> 'b -> unit) -> 'a list -> 'b list -> unit List.iter2 f \[a1; ...; an\] \[b1; ...; bn\] correspond à f a1 b1; ...; f an bn. Renvoie l'erreur : __Invalid_argument__ si les listes n'ont pas la même longueur.

[modifier] map2

('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list List.map2 f \[a1; ...; an\] \[b1; ...; bn\] correspond à \[f a1 b1; ...; f an bn\]. Renvoie l'erreur __Invalid_argument__ si les deux listes ont des longueurs différentes. n'est pas tail-rec.