Pourquoi F# ?
(batsov.com)- F# est un langage fonctionnel de la famille ML ciblant .NET, développé par Microsoft. Par rapport à C#, principalement orienté objet, F# se concentre sur le paradigme de la programmation fonctionnelle
- Cet article passe en revue les caractéristiques du langage F#, son écosystème, l’état de sa documentation, ses outils de développement, ses cas d’usage, sa communauté, ainsi que F# vs. OCaml
Qu’est-ce que F# ?
- F# est un langage de programmation généraliste conçu pour écrire du code concis, robuste et performant
- Il est conçu pour permettre de se concentrer sur la résolution du problème elle-même, sans se préoccuper d’une syntaxe complexe
- Il est open source, cross-platform et hautement compatible avec .NET
-
Caractéristiques
- Syntaxe légère et immutabilité par défaut
- Inférence et généralisation de types
- Fonctions de premier ordre, système de types puissant, pattern matching
- Prise en charge de la programmation asynchrone (Async)
- Langage à l’origine du célèbre opérateur de pipeline (
|>)
-
Exemple de code simple
open System let names = [ "Peter"; "Julia"; "Xi" ] let getGreeting name = $"Hello, {name}" names |> List.map getGreeting |> List.iter (printfn "%s") - F# a commencé comme un langage développé par Don Syme chez Microsoft Research en 2005
- Issu d’un projet de recherche visant à porter OCaml sur la plateforme .NET (Caml.NET)
- Il a ensuite été intégré comme produit officiel à partir de 2010, et F# 9.0 est sorti en 2024
- En 2025, il s’impose comme un langage mature qui fête ses 20 ans
- Principales raisons d’expérimenter F#
- Vérifier comment .NET a évolué en open source et cross-platform
- Comparer ses avantages et inconvénients face à OCaml
- Les bons retours sur le tooling, notamment Rider et Ionide
- Le simple intérêt d’explorer un langage
F# en tant que langage
- F# est un langage fonctionnel de la famille ML, avec une syntaxe familière pour les utilisateurs d’OCaml
- Les développeurs ayant utilisé Haskell ou Lisp peuvent aussi s’y adapter facilement
- Sa structure syntaxique repose sur les espaces, et comme en Python, l’indentation a une importance grammaticale
- Il est conçu pour que même les débutants puissent apprendre rapidement la syntaxe de base
-
Résumé des caractéristiques du langage
- La définition et l’application de fonctions peuvent s’exprimer de manière concise et naturelle
- Les conditions, boucles, tuples, traitements de listes s’utilisent proprement dans un style fonctionnel
- Les records, unions discriminées (Discriminated Union), pattern matching permettent de manipuler des structures de données complexes de manière concise
- Avec l’opérateur de pipeline (
|>), le flux de données peut être structuré visuellement de façon claire, comme un enchaînement de fonctions - F# est très adapté à l’écriture de scripts ad hoc, via des fichiers
.fsxexécutables directement avecdotnet fsi - Un environnement REPL est également fourni, ce qui le rend favorable à la programmation exploratoire
-
Une syntaxe conviviale
- Comprend des fonctionnalités pratiques comme les commentaires sur une ou plusieurs lignes, les variables
mutable, les slices de listes, etc. - Sa forte compatibilité avec C# permet d’utiliser facilement les API .NET
- La surcharge d’opérateurs pour différents types est aussi prise en charge de façon naturelle
printfnpermet d’afficher facilement différents types, utile pour le débogage et le logging
- Comprend des fonctionnalités pratiques comme les commentaires sur une ou plusieurs lignes, les variables
-
Un pionnier de la programmation asynchrone
- L’origine du modèle
async/await, c’est F# 2.0, qui a ensuite influencé plusieurs langages comme C# et JavaScript - F# fournit une structure qui permet d’implémenter la programmation asynchrone de façon intuitive, sans callback
- Le flux du code se lit comme du synchrone, tout en s’exécutant en réalité de façon asynchrone
- L’origine du modèle
-
L’investissement de Microsoft et l’évolution du langage
- Pendant longtemps, Microsoft a alloué peu de ressources à F#, mais en 2022, la création d’une équipe dédiée à Prague a marqué le début d’un véritable investissement
- Les sorties de F# 8.0 et 9.0 montrent que le langage et son tooling s’améliorent rapidement
- L’intérêt croissant de Microsoft en interne laisse entrevoir un potentiel d’évolution pour l’avenir
F# est un langage pratique, à la fois facile à apprendre et doté d’un système de types puissant ainsi que d’un paradigme fonctionnel, particulièrement très attractif pour les développeurs qui veulent introduire une approche fonctionnelle dans des projets basés sur .NET
Écosystème (Ecosystem)
- Après l’avoir utilisé pendant une période relativement courte, on constate que les bibliothèques ou frameworks purement dédiés à F# ne sont pas très nombreux
- La plupart des utilisateurs s’appuient surtout sur les API de base de .NET et des bibliothèques tierces principalement conçues pour C#
- C’est un phénomène courant dans les hosted languages comme Scala, Clojure ou Groovy
-
Principales bibliothèques pour le développement web
- Giraffe : framework web léger basé sur ASP.NET Core, orienté style fonctionnel
- Suave : framework simple de serveur web dans un style combinator, pour le routage et la composition de traitements
- Saturn : framework de style MVC construit sur Giraffe, inspiré par Ruby on Rails et Phoenix
- Bolero : framework de développement d’applications client basé sur WebAssembly et Blazor
- Fable : transpile F# vers JavaScript pour l’intégrer à l’écosystème JS, notamment React et Node.js
- Elmish : framework UI basé sur le pattern MVU (Model-View-Update), souvent utilisé avec Fable
- SAFE Stack : stack de développement web fonctionnel end-to-end combinant Saturn, Fable, Elmish, Azure, etc.
-
Principales bibliothèques pour la data science
- Deedle : bibliothèque d’analyse et de manipulation de données dans un style proche de pandas
- DiffSharp : bibliothèque orientée mathématiques proposant machine learning et différenciation automatique
- FsLab : boîte à outils intégrée pour la data science comprenant visualisation, analyse statistique, etc.
État de la documentation
- La documentation officielle est globalement bien structurée et de bonne qualité
- Une partie se trouve sur Microsoft Docs, une autre sur la F# Software Foundation
- Son organisation peut sembler un peu dispersée, mais le guide de style du langage, les documents de conception et l’API de la bibliothèque standard sont très utiles
-
Liens de documentation recommandés
-
Ressources communautaires d’apprentissage
- F# for Fun and Profit : collection de tutoriels et d’essais (un peu ancienne, mais toujours valable)
Outils de développement (Dev Tooling)
- Par le passé, l’écosystème des outils de développement F# était optimisé presque uniquement pour Visual Studio, avec peu de support pour les autres éditeurs
- Heureusement, l’environnement outillage s’est considérablement amélioré au cours des dix dernières années
-
Tournant technique : FSharp.Compiler.Service (FCS)
- FCS est une bibliothèque unique qui regroupe le compilateur F#, les fonctions de support éditeur et un moteur de scripting, permettant d’utiliser F# dans divers éditeurs et environnements de tooling
- Grâce à elle, le support F# a pu arriver dans VS Code, les générateurs de documentation et des backends alternatifs, favorisant l’expansion de l’écosystème
- Exemple représentatif : Ionide fournit un support F# riche dans VS Code et a dépassé le million de téléchargements
-
Éditeurs testés
- Emacs (
fsharp-mode) : fonctionnalités de base, pas de support TreeSitter, faible activité de développement - Zed : support F# limité
- Helix : support de base présent
- VS Code (plugin Ionide) : l’un des environnements les plus aboutis
- JetBrains Rider : IDE commercial, mais avec un support F# très solide
La plupart des fonctionnalités reposent sur le serveur de langage F# (
fsautocomplete), donc tout éditeur avec un bon support LSP peut être utilisé - Emacs (
-
Points décevants
fsharp-moderepose sur une base de code ancienne et évolue lentement- Zed manque de fonctionnalités
- Dans VS Code, certaines fonctions (par ex. extension/réduction de sélection) ne marchent pas correctement
- Certains utilisateurs trouvent aussi VS Code inconfortable à cause des problèmes de raccourcis clavier ou du modèle modal
-
Formateur et linter de code
- Fantomas : formateur de code officiel de F#, utilisé par la plupart des utilisateurs et équipes
- FSharpLint : autrefois populaire, mais aujourd’hui pratiquement à l’arrêt
- Toutefois, grâce à la puissance du compilateur, la dépendance aux linters reste faible
-
Autres outils
Cas d’usage (Use Cases)
- Grâce à la largeur de l’écosystème .NET, F# peut être envisagé dans de nombreux domaines
- En particulier, la fonctionnalité des Type Providers le rend très adapté aux travaux d’analyse et de manipulation de données
- Il convient aussi au développement de services backend et d’applications full stack, et certains outils permettent même le développement frontend
-
Principaux domaines d’usage
- Analyse de données : les Type Providers de F# permettent de manipuler les données avec un typage statique
- Services backend : F# peut être utilisé avec les puissants frameworks web de .NET
- Applications frontend : Fable et Elmish permettent un développement UI intégré à l’écosystème JS
- À partir de
Fable 4, la transpilation est aussi possible vers TypeScript, Rust, Python et d’autres langages
- À partir de
-
Exemple Fable (commande de transpilation simple)
- JavaScript :
dotnet fable - TypeScript :
dotnet fable --lang typescript - Python :
dotnet fable --lang python
- JavaScript :
Situation de la communauté
- Globalement, la communauté n’est pas grande, et elle est peut-être même plus petite que celle d’OCaml
- Reddit et Discord sont les espaces de communication les plus actifs
- Il existe aussi une communauté Slack, mais elle est difficile d’accès à cause de problèmes dans le système d’automatisation des invitations
- Le rôle de Microsoft dans la communauté reste flou, avec une dynamique plutôt portée par la communauté elle-même
-
Principales ressources gérées par la communauté
- Amplifying F# : promouvoir F# et encourager l’implication des entreprises
- F# for Fun and Profit : archive de tutoriels et d’essais
- F# Lab : toolkit communautaire F# pour la data science
- F# Weekly : newsletter récapitulant l’actualité récente de F#
Popularité et réalité (The Popularity Contest)
- F# n’occupe pas un rang élevé dans la plupart des indicateurs de popularité (TIOBE, StackOverflow, offres d’emploi, etc.)
- Mais c’est aussi la réalité de la plupart des langages fonctionnels, et pas un problème propre à F#
- Il reste en dehors du courant dominant, mais possède tout de même une base d’utilisateurs comparable à celle d’autres langages fonctionnels comme Clojure, OCaml, Emacs Lisp
-
Pourquoi utiliser F# ?
- Les raisons de choisir un langage de programmation ne se limitent pas aux perspectives d’emploi
- Pour le plaisir (on dit parfois que le F de F# signifie “Fun”)
- Pour apprendre de nouveaux paradigmes et de nouvelles idées
- Pour s’entraîner à penser autrement, hors de ses schémas habituels
- Les raisons de choisir un langage de programmation ne se limitent pas aux perspectives d’emploi
-
Ressources associées
- Article sur la popularité de F#
- Analyse de la popularité de F# en 2024
- On peut aussi consulter la version vidéo de cet article
Comparaison F# vs OCaml
L’objectif initial de F# était d’apporter les avantages d’OCaml à .NET, et les avantages de .NET à OCaml
– Don Syme, créateur de F#
- F# a été développé en s’inspirant d’OCaml, et la similitude était telle au départ qu’il supportait même les extensions de fichiers
.mlet.mli - Avec le temps, il a évolué en un langage de plus en plus indépendant, et suit désormais sa propre trajectoire
-
Avantages de F#
- Basé sur la plateforme .NET
- Accès à un très grand nombre de bibliothèques
- Support de Microsoft
- Accueillant pour les débutants
- Syntaxe familière pour ceux qui ont déjà utilisé des langages orientés objet (comme C#)
- Messages d’erreur du compilateur relativement clairs
- Expérience de débogage plus intuitive
- Très bon support de la programmation asynchrone
- Fonctionnalités absentes d’OCaml
- Anonymous records
- Active patterns
- Expressions de calcul (computational expressions)
- Compréhensions de séquences
- Type providers
- Units of measure
- Basé sur la plateforme .NET
-
Inconvénients de F#
- Basé sur la plateforme .NET
- Beaucoup de compromis de conception liés à l’interopérabilité avec
.NET(comme l’acceptation denull)
- Beaucoup de compromis de conception liés à l’interopérabilité avec
- Possédé par Microsoft
- Les avis sur Microsoft peuvent varier
- Relativement peu de ressources sont allouées à F#
- On ne sait pas à long terme jusqu’où Microsoft continuera à soutenir F#
- Problèmes liés au nom
- Les conventions de nommage
PascalCaseetcamelCasepeuvent déplaire à certains - Le nom F# peut poser problème en recherche ou dans les noms de fichiers (d’où l’usage fréquent de FSharp)
- Les conventions de nommage
- Absence de certaines fonctionnalités avancées présentes en OCaml
- Modules de premier ordre, foncteurs (functor)
- Support insuffisant de GADT
- Pas de mascotte, et pas de chameau non plus
- Basé sur la plateforme .NET
-
Points communs et comparaison croisée
- Les deux langages peuvent cibler le runtime JavaScript
- F# : Fable
- OCaml : js_of_ocaml, Melange
- Aujourd’hui, Fable donne l’impression d’être plus mature, même si davantage d’expérience réelle serait nécessaire
- Ce sont tous deux des langages puissants mais de niche, avec peu de chances de devenir largement grand public à court terme
- F# a l’avantage pratique de pouvoir s’introduire progressivement dans une base de code C# existante
- Un inconvénient est que les projets F# utilisent toujours des fichiers projet XML et qu’il faut définir manuellement l’ordre de compilation
- Cela peut sembler fastidieux en comparaison avec le système de build
Duned’OCaml
- Cela peut sembler fastidieux en comparaison avec le système de build
- Pour l’apprentissage ou l’étude de la structure des langages, OCaml peut être plus adapté
- Pour des services web pragmatiques ou du développement backend, F# peut être un meilleur choix
- En particulier, F# est un outil très puissant en tant que langage qui s’intègre bien à
.NETtout en conservant un style fonctionnel
- Les deux langages peuvent cibler le runtime JavaScript
Impression finale
- L’auteur a trouvé F# bien plus amusant et pratique qu’il ne l’imaginait
- Il dit avoir ressenti quelque chose de proche de sa première découverte de Clojure
- Cela lui a notamment rappelé que Clojure était le Lisp le plus pratique grâce à son excellente interopérabilité avec Java
- Si .NET avait été open source et portable dès le départ,
- ClojureCLR aurait peut-être connu davantage de popularité
- et la communauté ainsi que l’écosystème de F# auraient aussi pu croître davantage
- Le fait que F# n’ait pas été open source avant 2010 a aussi freiné son adoption initiale
"Le plus grand tort a été que .NET et F# n’étaient pas open source au départ, ce qui a fait perdre beaucoup d’opportunités" – Don Syme
- OCaml n’est pas non plus difficile à apprendre, mais pour quelqu’un qui découvre les langages de la famille ML, F# peut être plus facile
- La barrière d’entrée jusqu’à la production est aussi plus basse
- L’auteur souligne en particulier que les développeurs ayant une expérience .NET ont vraiment intérêt à essayer F#
- F# n’est pas seulement excellent comme langage autonome, il donne aussi accès au puissant écosystème de .NET
- Avec des outils comme Fable, il est possible de transpiler du code F# vers JavaScript, Dart, Rust, Python, etc.
- Dans la communauté F#, on dit que « le F de F# signifie Fun »
- Après l’avoir utilisé lui-même, l’auteur estime que c’est vrai, et insiste sur le fait que ce n’est pas seulement amusant, mais aussi pratique
- Enfin, il mentionne aussi la stabilité et la fiabilité de F# avec l’idée que « quand ça compile, ça fonctionne en général »
In sane type systems we trust!
1 commentaires
Discussion sur Hacker News
F# était le meilleur langage fonctionnel pour réécrire une application Ruby on Rails
J'ai essayé F#, mais j'étais nouveau dans l'écosystème .NET
Notre entreprise est passée de C# à F# il y a 6 ans
Si l'adoption de F# stagne, c'est à cause d'un mauvais système de build
J'ai appris F# en 2013 et j'y ai pris beaucoup de plaisir
F# est un cas rare où tous ses utilisateurs semblent très satisfaits
Les avantages de F# diminuent à mesure que C# récupère nombre de ses fonctionnalités
Il existe un SaaS rentable entièrement écrit en F#
F# est un excellent langage
F# est magnifique, mais difficile à utiliser avec aisance