Fonctions spécifiques
Fonctions propres à un type
Module Map
MapCe module comporte quelques fonctions spécifiques qui sont intéressantes à connaître :
Map.change : modification intelligente
Map.change : modification intelligenteSignature : Map.change key (f: 'T option -> 'T option) table
Selon la fonction f passée en argument, on peut : → Ajouter, modifier ou supprimer l'élément d'une clé donnée
Entrée
Renvoie None
Renvoie Some newVal
None
(Élément absent)
Ignore cette clé
Ajoute l'élément (key, newVal)
≡ Map.add key newVal table
Some value
(Élément existant)
Supprime la clé
≡ Map.remove key table
Passe la valeur à newVal
≡ Map.add key newVal table
containsKey vs exists vs filter
containsKey vs exists vs filterFonction Signature Commentaire
------------+--------------------------------+---------------------------------------------------------
containsKey 'K -> Map<'K,'V> -> bool Indique si la clé est présente
exists f -> Map<'K,'V> -> bool Indique si un couple clé/valeur satisfait le prédicat
filter f -> Map<'K,'V> -> Map<'K,'V> Conserve les couples clé/valeur satisfaisant le prédicat
Avec prédicat f: 'K -> 'V -> boollet table = Map [ (2, "A"); (1, "B"); (3, "D") ]
table |> Map.containsKey 0 // false
table |> Map.containsKey 2 // true
let isEven i = i % 2 = 0
let isFigure (s: string) = "AEIOUY".Contains(s)
table |> Map.exists (fun k v -> (isEven k) && (isFigure v)) // true
table |> Map.filter (fun k v -> (isEven k) && (isFigure v)) // map [(2, "A")]Module Seq
SeqCe module comporte une fonction spécifique très intéressante :
Seq.cache
Seq.cacheLe principe d'une séquence (aka énumérable) est qu'elle est reconstruit à chaque fois qu'elle est parcourue. Cette reconstruction peut être coûteuse. Un algorithme parcourant (même partiellement) plusieurs fois une séquence invariante peut être optimisé en mettant en cache cette séquence au moyen de la fonction Seq.cache.
Signature : Seq.cache: source: 'T seq -> 'T seq
La mise en cache est optimisée en étant différée et en ne se faisant que sur les éléments parcourus.
Type string
stringPour manipuler les caractères d'une chaîne, plusieurs options sont possibles.
Module Seq
SeqLe type string implémente Seq<char> (i.e. System.Collections.Generic.IEnumerable<char>).
→ On peut donc utiliser les fonctions du module Seq.
Module Array
ArrayLa méthode d'instance ToCharArray() permet de renvoyer les caractères d'une chaîne sous la forme d'un char array.
→ On peut donc utiliser les fonctions du module Array.
Module String
StringIl existe également un module String (venant de FSharp.Core) proposant quelques fonctions intéressantes car + performantes individuellement que celles de Seq et Array :
→ Module (FSharp.Core.)String (≠ System.String)
→ Propose quelques fonctions similaires à celles de Seq en + performantes :
Exemples :
☝️ Note : lorsque l'on a fait un open System, String représente 3 choses que le compilateur arrive à différencier :
Les constructeurs
(new) String(...).String.donne accès à l'ensemble des fonctions du moduleString(en camelCase) et des méthodes statiques deSystem.String(en PascalCase).
Array2D
Au lieu de fonctionner avec une imbrication de collections à N niveaux, F# propose des tableaux multidimensionnels (également appelés matrices). En revanche, pour les créer, il n'y a pas de syntaxe spécifique, il faut passer par une fonction de création. Voyons cela pour les tableaux de dimension 2.
Type
Le type d'un tableau à 2 dimensions est 't[,] mais l'IntelliSense donne parfois juste 't array qui est moins précis, n'indiquant plus le nombre de dimensions.
Création
array2D permet de créer un tableau à 2 dimensions à partir d'une collection de collections ayant toutes la même longueur.
Array2D.init permet de générer un tableau en spécifiant :
→ Sa longueur selon les 2 dimensions N et P
→ Une fonction générant l'élément aux deux indices spécifiés.
Accès par indices
Longueurs
Array2D.length1 et Array2D.length2 renvoient le nombre de lignes et de colonnes.
Slicing
Syntaxe permettant de ne prendre qu'une tranche horizontale et/ou verticale au moyen de l'opérateur .. et du caractère wilcard * pour prendre tous les indices
Cette fonctionnalité offre beaucoup de souplesse. Comme pour une collection de collections, une matrice permet un accès par ligne (matrix[row, *] vs list[row]). Une matrice autorise en plus un accès direct par colonne (matrix[*, col]), ce qui n'est possible pas avec une collection de collections sans la transposer au préalable - cf. fonction transpose (doc).
Autres utilisations
Autres fonctions : 🔗 https://fsharp.github.io/fsharp-core-docs/reference/fsharp-collections-array2dmodule.html
Last updated
Was this helpful?