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
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
> dotnetSi 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 HelloWorldAprè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 runpour 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...
let
.
(* Ceci est un commentaire
qui peut s'étaler sur une ou plusieurs
lignes *)
// Ceci est un commentaire sur une seule ligne.
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."
Type | Description | Suffixe | Exemple |
---|---|---|---|
sbyte | Entier 8 bits signé | y | 42y 0b00101010y |
byte | Entier 8 bits non signé | uy | 42uy 0b00101010y |
int16 | Entier 16 bits signé | s | 42s |
uint16 | Entier 16 bits non signé | us | 42us |
int | Entier 32 bits signé | l ou aucun suffixe | 42 42l |
uint | Entier 32 bits non signé | u ou ul | 42u 42ul |
int64 | Entier 64 bits signé | L | 42L |
uint64 | Entier 64 bits non signé | UL | 42UL |
float | Nombre à virgule flottante 32 bits | f ou F | 4.2f ou 4.2F |
bigint | Entier non limité à la représentation 64 bits | I | 4299999999999999999999999999I |
décimal | nombre fractionnaire représenté sous la forme d'un nombre à virgule fixe ou rationnel | m ou M | 0.42M ou 0.42m |
char | Caractère de type Unicode | aucun | 'a' ou '\u0061' |
string | Chaîne Unicode | aucun | "Le nombre de la vie\n" |
Byte | Caractère de type ASCII | B | 'a'B |
Byte[] | Chaîne de caractères de type ASCII | B | "texte"B |
String ou Byte[] | Chaîne textuelle | @ préfixe | @"\\serveur\partage" Unicode @"\\serveur\partage"B |
0x
),
en octal (0o
) ou binaire (0b
).
[<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"
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)