Tuples
Dernière mise à jour
Cet article vous a-t-il été utile ?
Dernière mise à jour
Cet article vous a-t-il été utile ?
Types à valeurs littérales
Types "anonymes" mais on peut leur définir des alias
Types produit par excellence
Signe *
dans signature A * B
Produit 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
, alors A * B
≠ B * A
Syntaxe des littéraux : a,b
ou a, b
ou (a, b)
Virgule ,
caractéristique des tuples
Espaces optionnels
Parenthèses ()
peuvent être nécessaires
Piège : séparateur différent entre un littéral et sa signature
,
pour littéral
*
pour signature
Ex : true, 1.2
→ bool * float
👍 Même syntaxe que construction
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 ()
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)
Tuples à 2 éléments
Tellement courant que 2 helpers leur sont associés :
fst
comme first pour extraire le 1° élément de la paire
snd
comme second pour extraire le 2° élément de la paire
1. Comment implémenter soi-même fst
et snd
?
2. Quelle est la signature de cette fonction ?
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
struct
Littéral : struct(1, 'b', "trois")
Signature : struct (int * char * string)
Déconstruction: let struct(i, _, _) = myStructTuple
Usage : optimiser performance
Tous les éléments doivent apparaître dans la déconstruction
→ 💡 Utiliser la discard _
pour ignorer l'un des éléments
️ Ne marche que pour les paires
🔗