Fonctions standard

La librairie FSharp.Core.dll est automatiquement importée dans un projet F# ou en console FSI. Elle fournit les opérateurs et fonctions standard (doc). En voici les fonctions principales :

Conversion

box, tryUnbox, unbox : boxing et (tentative de) unboxing

let i = 123     // val i : int = 123
let o = box i   // val o : obj = 123

let i2: int = unbox o     // val i3 : int = 123
let i3 = unbox<int> o     // val i2 : int = 123

let ok = tryUnbox<int> o      // val ok : int option = Some 123
let ko = tryUnbox<string> o   // val ko : string option = None

unbox<float> o  //  💥 System.InvalidCastException

byte, char, decimal, float, int, string : conversion en byte, char, ...

let c_ko = char "ab"  // 💥 System.FormatException
let c1 = char "c"     // val c1 : char = 'c'
let c2 = char 32      // val c2 : char = ' '

let i_ko = int " "  // 💥 System.FormatException
let i1 = int "30"   // val i1 : int = 30
let i2 = int ' '    // val i2 : int = 32
let i3 = int 12.6   // val i3 : int = 12

enum<'TEnum> : conversion en l'enum spécifié → Cf. Enums > Conversion

Reflection

nameof, typeof :

typedefof est intéressant avec un type générique :

Math

  • abs, sign : valeur absolue, signe (-1 si < 0...)

  • (a)cos(h), (a)sin, (a)tan : (co)sinus/tangente (inverse/hyperbolique)

  • ceil, floor, round : arrondi (inf, sup)

  • exp, log, log10 : exponentielle, logarithme...

  • pown x (n: int) : power = x à la puissance n

  • sqrt : square root / racine carrée

Identité id

Définition let id x = x

Signature : (x: 'T) -> 'T → Fonction à un seul paramètre d'entrée → Qui ne fait que renvoyer ce paramètre

Pourquoi une telle fonction ❓ → Nom id = abréviation de identity → Zéro / Élément neutre de la composition des fonctions

Opération
Identité
Exemple

Addition +

0

0 + 55 + 05

Multiplication *

1

1 * 55 * 15

Composition >>

id

id >> fnfn >> idfn

Cas d'utilisation de id

Avec une high-order function faisant 2 choses : • 1 opération • 1 mapping de valeur via param 'T -> 'U

Ex : List.collect fn list = flatten + mapping

Comment faire juste l'opération et pas de mapping ?

  • list |> List.collect (fun x -> x) 👎

  • list |> List.collect id 👍

  • ☝ Meilleure alternative : List.concat list 💯

Autres

  • compare a b : int: renvoie -1 si a < b, 0 si =, 1 si >

  • hash : calcule le hash (HashCode)

  • max, min : maximum et minimum de 2 valeurs comparables

  • ignore : pour "avaler" une valeur et obtenir unit

Extras

On utilise couramment les fonctions suivantes, non standard donc en les recodant ou en utilisant celles du module Prelude (source) du package NuGet FSharpx.Extras.

Flip

flip, flip3 et flip4 permettent d'inverser l'ordre des paramètres d'une fonction, de sorte que le dernier devienne le premier.

Curry

curry et curry3 permettent de curryfier des fonctions tuplifiées de 2 ou 3 paramètres. uncurry et uncurry3 font l'inverse.

Konst

konst est une fonction sink par rapport à son deuxième argument, ignoré pour renvoyer toujours le premier argument, la constante. → Exemple : générer un prédicat toujours vrai, pour le passer à une fonction d'ordre supérieur telle que filterMap ci-dessous :

💡 ignorekonst ()

Tee

tee (appelée également tap) permet d'appliquer une valeur à une fonction et de renvoyer cette valeur, en ignorant l'éventuel retour de la fonction. C'est utile avec une fonction à effet de bord, par exemple pour logguer une valeur intermédiaire dans un pipeline :

Parse

Les types primitifs Boolean, Byte, SByte, UInt16, Int16, UInt32, Int32, UInt64, Int64, Decimal, Single, Double, DateTime, DateTimeOffset sont étendus avec la méthode statique parse qui encapsule la classique méthode statique .NET TryParse. L'objectif est de renvoyer une Option (📍 Type Option) plutôt qu'un bool et une variable out (📍 ).

String

Le module String encapsule les méthodes d'instance de string dans des fonctions pour être utilisées plus facilement dans les pipelines. En voici quelques exemples :

Note : les fonctions surchargées auraient bénéficier d'un nom plus parlant, par exemple :

Last updated

Was this helpful?