Aller au contenu
learn

F# pour développeurs C#/Java — Mission

Vous écrivez du C# ou du Java. Vous avez utilisé des lambdas, LINQ ou les streams, des records, peut-être des expressions switch avec des motifs. F# reprend ces idées, que C# et Java ont empruntées aux langages fonctionnels ces quinze dernières années, et en fait la norme : des valeurs qui ne changent pas, des fonctions qui renvoient des valeurs au lieu de modifier un état, des types qui décrivent chaque cas de vos données, et un compilateur qui vérifie que vous les avez tous traités.

F# tourne sur .NET, appelle toutes les bibliothèques .NET et compile vers le même langage intermédiaire que C#. Vous n’avez pas à quitter votre écosystème pour l’apprendre, et ce que vous apprenez change votre façon d’écrire du C#.

Ce cours utilise les versions actuelles : F# 10, livré avec .NET 10, sorti en novembre 2025.

Les exemples viennent de deux bases de code F# publiques, épinglées sur un commit pour que les liens continuent de pointer vers le code que décrivent les leçons :

  • TARS, un framework d’agents en F# (raisonnement, workflows multi-agents, grammaires probabilistes), au commit 87464ce. Son code actif se trouve dans v2/ : les leçons ne citent que des projets que sa solution v2/Tars.sln compile et que sa CI teste.
  • Guitar Alchemist (GA), une application de théorie musicale écrite surtout en C#, dont le DSL musical, les parseurs, la configuration et le serveur de langage sont en F#, au commit 32f143c.

Quand un extrait de GA compile seul, le cours garde une copie du fichier dans code/fsharp/external/ga (GA est sous licence MIT) et l’exécute. TARS n’a pas de fichier de licence : son code est donc lié et cité, et reproduit en quelques lignes seulement là où il faut montrer un comportement. Ce que les leçons trouvent dans ces dépôts (un bug, du code mort, un script qui ne s’exécute pas) va dans le journal.

Chaque leçon part de ce que vous écririez en C# (et en Java quand c’est différent), puis :

  1. la manière F#, avec un court script et la sortie qu’il a réellement affichée ;
  2. le point de vue du compilateur : les erreurs et avertissements que vous rencontrerez, avec leur message exact ;
  3. du vrai code de TARS ou de GA qui utilise la notion ;
  4. des exercices, avec une solution sous Solution : essayez d’abord, puis ouvrez-la.
  • exécuter des scripts F# et F# Interactive, et organiser un projet F# dont les fichiers compilent dans l’ordre ;
  • modéliser un domaine avec des records, des unions discriminées et des options, pour que les états invalides ne compilent pas ;
  • écrire des fonctions qui se composent, avec des pipelines, l’application partielle et un filtrage par motif exhaustif ;
  • gérer les erreurs avec Result, et écrire et lire des expressions de calcul, y compris les miennes ;
  • tester du code F# avec xUnit, FsCheck et Expecto, et analyser du texte avec FParsec ;
  • mesurer et réduire les allocations, et choisir entre Async, Task et MailboxProcessor ;
  • lire et étendre une vraie base de code F#, et publier une bibliothèque F# que du code C# consomme confortablement.
# Leçon Notions Vrai code
Débutant
1 Scripts, F# Interactive et projets dotnet fsi, scripts .fsx, printfn, #r "nuget:", indentation, l’ordre des fichiers d’un .fsproj GA.Business.DSL.fsproj et Scripts/ModesConfig.fsx de GA, Tars.Core.fsproj de TARS
2 Valeurs, fonctions et inférence de types let, immuabilité, mutable, inférence, curryfication, application partielle, |> et >>, des expressions partout HarmonicTransformationService de GA, TextNormalizer de TARS
3 Tuples, records, unions et options tuples, records et with, unions discriminées, Option, unions à un seul cas, RequireQualifiedAccess ChordAst de GA, Domain.fs et Primitives.fs de TARS
4 Filtrage par motif match, gardes, motifs « ou », motifs de listes et de records, avertissements d’exhaustivité ChordRenderer, ChordParser et BinObj.fsx de GA, AgentWorkflow.fs de TARS
5 Listes, tableaux et séquences modules List, Array et Seq, pipelines à côté de LINQ et des streams, évaluation paresseuse
6 Modules, espaces de noms et organisation d’un projet modules, espaces de noms, private et internal, fichiers de signature
Intermédiaire
7 Les erreurs avec Result programmation orientée « rails », Result à côté des exceptions
8 Expressions de calcul — un parseur pour un DSL seq, async, task, builders, Bind, Return, un parser CE et la fin explicite du texte le DSL musical de GA
9 Les objets en F# classes, interfaces, expressions objet, appel de bibliothèques C#
10 Tests xUnit, tests de propriétés avec FsCheck, Expecto
11 Parseurs FParsec et combinateurs écrits à la main le DSL musical de GA
12 Modéliser un domaine unités de mesure, types fantômes, rendre les états illégaux non représentables Budget de TARS
Avancé et expert
13 Expressions de calcul personnalisées builders, let! et and!, ce que génère le compilateur AgentWorkflow de TARS
14 Type providers — des données typées à partir d’un échantillon providers effacés et génératifs, inférence CSV et JSON, stabilité du schéma FSharp.Data
15 Performance structs, inline, Span, voption, allocations mesurées avec BenchmarkDotNet
16 Concurrence MailboxProcessor, Async à côté de Task, canaux
17 Métaprogrammation Myriad, FSharp.Compiler.Service le pool de sessions F# Interactive de GA
18 Outillage un serveur de langage en F#, Fantomas, analyseurs GaMusicTheoryLsp de GA
19 Architecture d’une vraie application F# une lecture guidée de TARS TARS
20 Publier une bibliothèque F# pour C# conception d’API, [<CompiledName>], options et unions vues de C#
— Journal

Les leçons 9 à 13 et 15 à 20 sont prévues et pas encore écrites.