Match expression

Présentation

Similaire à une expression switch en C♯ 8.0 en + puissant grâce aux patterns

Syntaxe :

match test-expression with
| pattern1 [ when condition ] -> result-expression1
| pattern2 [ when condition ] -> result-expression2
| ...

Renvoie le résultat de la 1ère branche dont le pattern "match" test-expression

Note : toutes les branches doivent renvoyer le même type !

Exhaustivité

Un switch doit toujours définir un cas par défaut (cf. pattern wildcard _) Sinon : warning à la compilation, risque de 💥 MatchFailureException au runtime

Pas nécessaire dans une match expression si les branches couvrent tous les cas car le compilateur vérifie leur exhaustivité et les branches "mortes"

let fn x =
    match x with
    | Some true  -> "ok"
    | Some false -> "ko"
    | None       -> ""
    | _          -> "?"  // ⚠️ Warning FS0026: Cette règle n'aura aucune correspondance

Conseil : + les branches sont exhaustives, + le code est explicite et sûr

Exemple : matcher tous les cases d'un type union permet de gérer l'ajout d'un case par un warning à la compilation : Warning FS0025: Critères spéciaux incomplets dans cette expression

  • Détection d'un ajout accidentel

  • Identification du code à changer pour gérer le nouveau case

Guard

Syntaxe : pattern1 when condition Usage : raffiner un pattern, via contraintes sur des variables

💡 La guard n'est évaluée que si le pattern est satisfait.

Guard et Pattern OR

Le pattern OR a une precedence/priorité plus élevée que la guard :

Mot clé function

Syntaxe :

Equivalent à une lambda prenant un paramètre implicite qui est "matché" :

Intérêts

a. Dans un pipeline :

b. Écriture plus succincte d'une fonction :

Limites

⚠️ Paramètre implicite => peut rendre le code + difficile à comprendre !

Exemple : fonction déclarée avec d'autres paramètres eux explicites → On peut se tromper sur le nombre de paramètres et leur ordre :

Fonction fold

Fonction associée à un type union et masquant la logique de matching Prend N+1 paramètres pour un type union avec N cases CaseI of 'DataI

  • N fonctions 'DataI -> 'T (1 / case), avec 'T le type de retour de fold

  • En dernier, l'instance du type union à matcher

Utilisation

Intérêt

fold masque les détails d'implémentation du type

Par exemple, on peut ajouter un case Kelvin et n'impacter que fold, pas les fonctions qui l'appellent comme toggleUnit :

Mis à jour

Ce contenu vous a-t-il été utile ?