Tuples

Points clés

  • 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 AB, alors A * BB * A

Construction

  • 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.2bool * 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 :

    • fst comme first pour extraire le 1° élément de la paire

    • snd comme 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

  • Littéral : struct(1, 'b', "trois")

  • Signature : struct (int * char * string)

  • Déconstruction: let struct(i, _, _) = myStructTuple

  • Usage : optimiser performance

🔗 https://docs.microsoft.com/en-us/dotnet/fsharp/style-guide/conventions #performance

Last updated

Was this helpful?