Tuples
Points clés
Types à valeurs littérales
Types "anonymes" mais on peut leur définir des alias
Types produit par excellence
Signe
*dans signatureA * BProduit cartésien des ensembles de valeurs de A et de B
Nombre d'éléments:
👌 2 ou 3 (
A * B * C)⚠️ > 3 : possible mais préférer Record
Ordre des éléments est important
Si
A≠B, alorsA * B≠B * A
Construction
Syntaxe des littéraux :
a,boua, bou(a, b)Virgule
,caractéristique des tuplesEspaces optionnels
Parenthèses
()peuvent être nécessaires
⚠️ Piège : séparateur différent entre un littéral et sa signature
,pour littéral*pour signatureEx :
true, 1.2→bool * float
Déconstruction
👍 Même syntaxe que construction
⚠️ Tous les éléments doivent apparaître dans la déconstruction
→ 💡 Utiliser la discard _ pour ignorer l'un des éléments
En pratique
Utiliser un tuple pour une structure de données :
Petite : 2 à 3 éléments
Légère : pas besoin de nom pour les éléments
Locale : échange local de données qui n'intéresse pas toute la codebase
Renvoyer plusieurs valeurs - cf.
Int32.TryParse
Tuple immuable : les modifications se font en créant un nouveau tuple
Égalité structurelle, mais uniquement entre 2 tuples de même signature !
Imbrication de tuples grâce aux ()
Pattern matching
Patterns reconnus avec les tuples :
☝ Notes :
Les patterns sont à ordonner du + spécifique au + générique
Le dernier pattern
(x, y)correspond au pattern par défaut (obligatoire)
Paires
Tuples à 2 éléments
Tellement courant que 2 helpers leur sont associés :
fstcomme first pour extraire le 1° élément de la pairesndcomme second pour extraire le 2° élément de la paire⚠️️ Ne marche que pour les paires
Quiz 🕹️
1. Comment implémenter soi-même fst et snd ?
2. Quelle est la signature de cette fonction ?
Réponse
1. Implémenter soi-même fst et snd ?
Déconstruction avec discard, le tout entre
()Fonctions peuvent être
inline
2. Signature de toList ?
Renvoie une liste avec les 2 éléments de la paire
Les éléments sont donc du même type
Ce type est quelconque → générique
'a
Réponse : la signature est x: 'a * y: 'a -> 'a list
ce qui correspond au type 'a * 'a -> 'a list
Tuple struct
structLittéral :
struct(1, 'b', "trois")Signature :
struct (int * char * string)Déconstruction:
let struct(i, _, _) = myStructTupleUsage : optimiser performance
🔗 https://docs.microsoft.com/en-us/dotnet/fsharp/style-guide/conventions #performance
Last updated
Was this helpful?