GERBELOTBARILLON.COM

Parce qu'il faut toujours un commencement...

0. Introduction


F# est un langage fonctionnel (d'où le F), impératif et orienté objet. Il est dédié à la plateforme Microsoft .Net. Il a été créé en 2002 par l'équipe Microsoft Research et son noyau dérive de OCaml, projet Open Source soutenu essentiellement par l'INRIA. Il reste fortement compatible avec ce dernier. Qui a dit que Microsoft ne s'intéressait pas au monde de l'Open Source ?

Le langage F# est caractérisé par une concision des instructions avec peu de symboles, offrant une grande souplesse dans l'écriture des programmes, ainsi que par une grande vitesse d'exécution, la quantité de librairies disponibles et une grande interopérabilité avec les autres langages (plateforme .Net).

F# est un langage fortement typé qui s'assure que les types de données utilisés représentent bien les données manipulées et peut réaliser une inférence de types, si jamais une expression manipule des données dont le type n'est pas précisé. C'est le compilateur qui se chargera de la bonne déclaration des éléments en usage. F# supporte également les types primitifs de .net (entiers, booléens, chaines de caractères, ...) ainsi que ses objets. Il permet également de gérer les types immuables ne pouvant évoluer après leur déclaration.

Enfin, F# est un langage concis (peu de symboles sans fioritures) et offrant une gestion des l'asynchronicité simplifiée (même principe que Javascript avec ses promesses) pour éviter les blocages. N'oublions pas non plus que F# est régulièrement nommé comme un des trois langages les plus utilisés et les mieux payés...

Références : Documentation Microsoft

1. Premier programme


Pour faire classique, nous allons réaliser un premier programme de type Hello World avec F#. La première étape consiste à installer le DotNet SDK. Pour vérifier que votre installation est correcte, il suffit de faire

> dotnet
Si la commande s'exécute correctement, vous obtiendrez une série d'informations sur la façon d'utiliser la commande dotnet. Pour créer votre application, la commande dotnet suivante va permettre de mettre en place une structure de projet de type console, en utilisant le langage défini par l'option -lang et créer un dossier spécifié après l'option -o.
> dotnet new console -lang F# -o HelloWorld
Après quelques secondes, vous allez obtenir un dossier du nom HelloWorld. Rendez vous dans ce dossier > cd HelloWorld et vous pourrez voir la structure DotNet ressemblant à celle-ci :
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        14/02/2021     18:55                obj
-a----        14/02/2021     18:55            245 HelloWorld.fsproj
-a----        14/02/2021     18:55            342 Program.fs
Le fichier principal Program.fs contient le code nécessaire pour écrire le message "Hello World" sur la console.

Une fois que vous avez bien observé le contenu du fichier Program.fs, vous pouvez exécuter la commande

> dotnet run
pour lancer l'application. Le premier démarrage, comme pour toutes les applications .Net, est assez long (bien plus qu'en C c'est sûr) mais une fois les différents caches mis en place, c'est plus rapide pour les fois suivantes...normalement...pas sûr...

2. F# Cheat Sheet


Déclarations

Toutes les déclarations de type, de fonction ou d'objet, s'effectuent avec le mot-clé let.

Commentaires

(* Ceci est un commentaire
qui peut s'étaler sur une ou plusieurs
lignes *)

// Ceci est un commentaire sur une seule ligne.

Chaînes de caractères

let hello = "Hello" + " World" // création d'une chaine par concaténation de chaines
let verbatim = @"<valeur attribut=""valeur attribut"">" // Chaine verbatim pour manipuler les caractères spéciaux
let triple = """<valeur attribut="valeur attribut">""" // Chaine verbatim avec 3 """ avant et après, plus facile à manipuler
let longue_phrase = 
   "Cette chaine s'étend sur\n\
   plusieurs lignes séparées par\n\
   des caractères backslash."

Les types de base

Les types de base sont les mêmes que ceux des autres langages, avec les nuances de type signé, non signé, de toutes les longueures (8 bits, 16 bits, 32 bits, 64 bits).
TypeDescriptionSuffixeExemple
sbyteEntier 8 bits signéy42y
0b00101010y
byteEntier 8 bits non signéuy42uy
0b00101010y
int16Entier 16 bits signés42s
uint16Entier 16 bits non signéus42us
intEntier 32 bits signél ou aucun suffixe42
42l
uintEntier 32 bits non signéu ou ul42u
42ul
int64Entier 64 bits signéL42L
uint64Entier 64 bits non signéUL42UL
floatNombre à virgule flottante 32 bitsf ou F4.2f ou 4.2F
bigintEntier non limité à la représentation 64 bitsI4299999999999999999999999999I
décimalnombre fractionnaire représenté sous la forme d'un nombre à virgule fixe ou rationnelm ou M0.42M ou 0.42m
charCaractère de type Unicodeaucun'a' ou '\u0061'
stringChaîne Unicodeaucun"Le nombre de la vie\n"
ByteCaractère de type ASCIIB'a'B
Byte[]Chaîne de caractères de type ASCIIB"texte"B
String ou Byte[]Chaîne textuelle@ préfixe@"\\serveur\partage" Unicode
@"\\serveur\partage"B
Les déclarations dans les autres bases que les bases décimales s'effectuent en mettant un préfixe spécifique en hexadécimal (0x), en octal (0o) ou binaire (0b).

Les littéraux nommés - Les constantes

Les valeurs devant être considérées comme des constantes peuvent être marquées par un attribut [<Literal>]. Une constante doit toujours débuter par une majuscule sous peine d'être considérée comme une simple variable devant être liée à la compilation.
[<Literal>]
let Chaine = "&" + "b"

[<Literal>]
let Filepath = @"somedisk:\somedir"

Les fonctions

let square x = x * x
printfn $"Le carré de {x} est {square x}"

L'opérateur pipe |> permet de lier et d'enchaîner les fonctions et les arguments.

let chainons x =
   x |> square |> negate |> print
      

Une fonction peut également être récursive en spécifiant le mot clé rec après le mot clé let.

let rec fact x =
   if x < 1 then 1
   else x * fact (x - 1)