Titre correct : ≪
F#
≫.
En raison de limitations techniques, la typographie souhaitable du titre n’a pu etre restituee correctement.
F#
|
|
|
Date de premiere version
|
2002
|
Paradigme
|
Fonctionnel
,
imperatif
,
oriente objet
|
Auteur
|
Don Syme,
Microsoft Research
|
Developpeur
|
F# Software Foundation
|
Derniere version
|
8.0 (14 novembre 2023)
|
Typage
|
Statique
,
fort
,
nominatif
,
infere
|
Influence par
|
OCaml
,
C#
,
Haskell
|
Implementations
|
.NET Framework
,
Mono
|
Licence
|
Licence Apache
|
Site web
|
fsharp.org
|
Extension de fichier
|
fs, fsi, fsx et fsscript
|
modifier
|
F#
est un
langage de programmation
fonctionnel
,
imperatif
et
oriente objet
pour la plate-forme
.NET
. F# est developpe par
Microsoft Research
et son noyau est derive du langage
OCaml
, avec lequel il est fortement compatible. Ces deux langages de programmation font partie de la meme famille que les
langages ML
.
Ce langage a ete concu specifiquement pour la plate-forme
.NET
, donc fortement oriente-objet. Depuis novembre 2010,
Microsoft
a mis a la disposition de tous les bibliotheques
core
et son compilateur F#, sous la
licence Apache
2
[
2
]
.
F# est un langage fortement type utilisant l'
inference de types
. Ce mecanisme delegue le typage des variables et des fonctions au compilateur. Neanmoins, le langage permet au developpeur d'indiquer explicitement le type a la declaration. Integre a l'ecosysteme .NET, F# supporte les types primitifs de la plate-forme ainsi que ses objets. De plus il etend le systeme de types et permet de faire la distinction entre les types dits immuables et ceux dits modifiables. Les objets sont consideres comme des types modifiables (en place), et sont utilises pour la mise en place du modele de programmation objet au sein du langage. Les types immuables sont utilises principalement lorsque l'on programme de maniere fonctionnelle ; la modification d'un type immuable cree une nouvelle instance sans pour autant ecraser l'ancienne.
Comme la plupart des langages derives de
ML
, F# utilise par defaut le mecanisme de l'
evaluation stricte
. Cependant il peut, a l'instar de
Haskell
, mettre en œuvre l'
evaluation paresseuse
des expressions grace a l'utilisation du mot-cle
lazy
. Pour la programmation fonctionnelle, il fournit plusieurs constructions et un ensemble de types immuables : les n-uplets, des enregistrements, des types sommes et des listes
[
3
]
.
Un
n-uplet
represente une collection de n valeurs, n ≥ 0. La valeur de n correspond a l'arite du n-uplet. Le type unit represente le n-uplet vide et dont l'unique valeur possible est (). Ce type est utilise pour typer des fonctions qui ne prennent pas en entree de valeur et/ou n'en renvoient pas. Le 3-uplet (ou triplet) est represente par
(A, B, C)
, ou A, B, et C peuvent etre de n'importe quel type. Un n-uplet peut etre utilise pour stocker des valeurs uniquement lorsque le nombre de valeurs est connu au moment du codage et reste constant tout au long de l'execution.
Un
enregistrement
est une version specialisee des n-uplets ou les champs sont nommes, comme dans
{ Nom:string; Age:int }
. Les enregistrements peuvent etre crees de la facon suivante :
{ Nom="Toto"; Age=1 }
. Le mot-cle
with
est utilise pour creer une copie de l'enregistrement :
{ r with Nom="CD" }
cree un nouvel enregistrement a partir d'un precedent enregistrement nomme r et dont il change la valeur du champ Nom.
Le
type liste
est une liste chainee qui peut se representer soit a l'aide de la notation
head::tail
(compose a l'aide de l'operateur
::
, l'equivalent de l'operateur cons des langages
Lisp
/
Scheme
), soit dans une notation abregee :
[item1; item2; item3]
. Une liste vide est notee
[]
.
La derniere sorte de
type algebrique de donnees
, les
types sommes
(qui sont, fonctionnellement, des equivalents types des unions du langage C) peuvent etre definis comme une somme de n'importe lequel des types immuables evoques precedemment. Par exemple,
type
A
=
|
ConstructorX
of
string
|
ConstructorY
of
int
peut contenir des valeurs instanciees soit par
ConstructorX
soit par
ConstructorY
. Le type des valeurs retournees par les constructeurs peut lui aussi etre defini.
Voici le traditionnel
hello world
:
(* Ceci est un commentaire *)
printfn
"Hello World!"
Cet autre exemple traditionnel chez les langages fonctionnels a pour objectif de montrer la concision que l'on peut obtenir avec ce type de langages :
let
rec
factorielle
n
=
match
n
with
|
0
->
1
|
_
->
n
*
factorielle
(
n
-
1
)
Cette variante, avec un accumulateur, met en œuvre la
recursion terminale
, une optimisation commune parmi les langages fonctionnels :
let
factorielle
n
=
let
rec
factorielle_recursive
n
accu
=
match
n
with
|
0
->
accu
|
_
->
factorielle_recursive
(
n
-
1
)
(
n
*
accu
)
factorielle_recursive
n
1
- (en)
Antonio
Cisternino
, Adam
Granicz
et Don
Syme
,
Expert F# 3.0
, Apress,
,
3
e
ed.
, 638
p.
(
ISBN
978-1-4302-4650-3
)
- (en)
Robert
Pickering
,
Foundations of F#
, Apress,
, 360
p.
(
ISBN
978-1-59059-757-6
)
- (en)
Jon
Harrop
(
pref.
Don Syme),
F# for scientists
, Wiley-Interscience,
, 368
p.
(
ISBN
978-0-470-24211-7
)
- (en)
Tomas
Petricek
et Jon
Skeet
(
pref.
Mads Torgersen),
Functional Programming for the Real World : With Examples in F# and C#
, Manning Publications,
, 529
p.
(
ISBN
978-1-933988-92-4
)
- (en)
Chris
Smith
,
Programming F# : A comprehensive guide for writing simple code to solve complex problems
,
O'Reilly
,
,
2
e
ed.
, 471
p.
(
ISBN
978-1-4493-2029-4
)
- (en)
Ted
Neward
, Aaron
Erickson
, Talbott
Crowell
et Rick
Minerich
,
Professional F# 2.0
, Wrox,
, 432
p.
(
ISBN
978-0-470-52801-3
)