# Premiers pas en OCaml/Filtrage de motif

Le filtrage de motif permet soit de gérer différents cas en fonction des valeurs d'une expression, soit d'accéder aux éléments d'un type construit (ou les deux à la fois).

## Principe général

Le filtrage de motif s'effectue avec les mots clefs match et with encadrant l’expression que l’on souhaite manipuler, suivi d'un ou plusieurs motifs, et à chaque motif est associée une expression à retourner.

## Filtrage de motif sur les entiers

En fonction de la valeur de l’expression Random.int 6 différentes chaînes de caractère peuvent être retournées :
Le caractère souligné à la fin est un joker qui récupère toutes les valeurs possibles qui n'ont pas été listées avant lui.

## Filtrage de motif sur les listes
### Déconstruction

Le filtrage de motif est le moyen privilégié pour manipuler les listes.
On peut alors accéder à un ou plusieurs éléments du côté de la tête, séparé(s) de la queue de la liste, et gérer le cas où la liste est vide.
Ici on renvoie la queue de la liste au cas où la liste en entrée n’est pas vide, et on renvoie une liste vide si la liste en entrée est vide elle aussi.
Il est possible de déconstruire plusieurs éléments de la tête de la liste :
Définissons ce filtrage de motif dans une fonction pour tester plusieurs valeurs d'entrée :
L'ordre dans lequel les motifs sont placés est parfois significatif, c’est le cas ici.
OCaml parcourt les motifs potentiels du premier au dernier dans l'ordre. C'est donc le premier motif qui peut correspondre à la valeur de l’expression d'entrée qui sera sélectionné, et c’est l’expression correspondant à ce motif qui sera retournée.
Voyons ce qui se passe avec les mêmes motifs spécifiés dans l’ordre inverse :
Ici le deuxième motif récupérera tous les éléments qui auraient pu correspondre pour le deuxième ou le troisième motif. En conséquence le deuxième et le troisième motif ne seront jamais utilisés. C'est pourquoi OCaml nous indique deux avertissements à ce sujet.

### Filtrage des valeurs possibles

Le filtrage de motif peut aussi servir à traiter différentes valeurs possibles de l’expression d'entrée.

## Filtrage de motif sur les tableaux

Le filtrage de motif est rarement utilisé sur les tableaux. D'une part cela requiert de connaître sa taille ou ses tailles possibles, et d’autre part cela n’est pas très idiomatique.
Voici cependant un exemple où le filtrage de motif s'applique sur le tableau Sys.argv ce qui permet de traiter différentes valeurs possibles de la ligne de commande avec lesquelles le script est appelé :
Copiez dans un fichier printsys.ml :
Appelez ce script avec l'interpréteur ocaml :

## Filtrage de motif sur les tuples

Voici un exemple :
Le filtrage peut contenir des valeurs données qui feront sélectionner une entrée donnée, et des variables qui récupéreront les autres valeurs utilisées dans le code qui suit cette entrée. Ici la première entrée est sélectionnée car les entrées sont testées dans l'ordre.

## Filtrage de motif sur les variants

Reprenons le type my_variant défini à la page précédente :
Le filtrage de motif de ce variant se fera comme suit :

## Filtrage de motif sur les enregistrements

Reprenons le type vector défini à la page précédente, définissons une variable de ce type et réalisons un filtrage avec :
Il est possible de ne filtrer qu'un des éléments de l'enregistrement :
Il est également possible de filtrer pour une valeur particulière d'un des champs de l'enregistrement :
| Structures de données | Manipulation sur les listes |