Introduite le 11 novembre dernier en même temps que .NET 10 et Visual Studio 2026, la version 10 de F# affiche plusieurs améliorations. Parmi elles, il y a la fonctionnalité de supprimer des alertes dans un périmètre défini. Désormais, le compilateur prend en charge la directive #warnon, laquelle est associée à #nowarn, pour désactiver ou activer les avertissements dans une section de code spécifique. Dans un blog, Microsoft indique que certains ajouts destinés à améliorer la cohérence des directives #nowarn/#warnon constituent des changements majeurs, susceptibles d'affecter une base de code lors de la mise à jour vers la nouvelle version.
F# 10 permet également aux développeurs d'appliquer des modificateurs d'accès distincts à des accesseurs de propriétés individuels. Grâce à cette fonctionnalité, les développeurs peuvent spécifier des niveaux d'accès pour les accesseurs getter et setter d'une propriété en ligne, ce qui permet d'utiliser des modèles courants tels que des états lisibles publiquement mais modifiables en privé sans code standard verbeux. Autre fonctionnalité de F# 10 : la possibilité pour les paramètres facultatifs d'utiliser une représentation ValueOption<'T> basée sur une structure. En appliquant l'attribut [] à un paramètre facultatif, les développeurs peuvent demander au compilateur d'utiliser ValueOption<'T> au lieu du type d'option basé sur une référence. Cela évite une allocation de mémoire pour le wrapper d'option, ce qui est avantageux dans le code où les performances sont critiques.
Plusieurs autres évolutions
Parmi les autres améliorations de F# 10, on peut citer : la possibilité pour les constructeurs d'expressions de calcul d’opter désormais pour des optimisations d’appels en queue ou tail call. Par ailleurs, la résolution d’une incohérence de longue date dans la syntaxe des annotations de type pour les liaisons d'expressions de calcul. Les développeurs peuvent à présent ajouter des annotations de type aux liaisons let!, use! et and! sans avoir à mettre l'identifiant entre parenthèses. De son côté, le modèle de suppression (_) fonctionne dorénavant dans les liaisons use! au sein des expressions de calcul. F# 10 permet d'utiliser _ directement lors de la liaison de ressources asynchrones dont les valeurs ne sont nécessaires que pour la gestion de la durée de vie. Il n'est pas nécessaire de fournir un identifiant nommé.
De même, la validation structurelle a été renforcée afin de rejeter les placements trompeurs de modules au sein des types. F# 10 génère désormais une erreur lorsqu'une déclaration module apparaît indentée au même niveau structurel dans une définition de type, évitant ainsi une source courante de confusion concernant la portée des modules. Le compilateur mémorise les résultats des vérifications des relations entre les types, ce qui réduit les calculs redondants et améliore les performances du compilateur et des outils. On notera également que dans la bibliothèque FSharp.Core, la prise en charge de and! a été ajoutée dans l'expression de calcul task. L'utilisation de task est un moyen courant de travailler avec des flux de travail asynchrones dans F#, en particulier lorsque l'interopérabilité avec C# est requise. Dans F# 10, trois fonctionnalités (vérification des types basée sur les graphes, génération de code IL parallèle et optimisation parallèle) sont regroupées sous la propriété ParallelCompilationproject. Enfin, lors de la publication avec le rognage activé (PublishTrimmed=true), la compilation F# génère désormais automatiquement un fichier de substitutions qui cible les ressources F# réservées aux outils. Cela se traduit par une sortie plus petite par défaut, moins de code standard et un risque de maintenance en moins.