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
functionSyntaxe :
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
foldFonction 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'Tle type de retour defoldEn 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 ?