Désormais généralement disponible, la dernière édition du langage de programmation open source « fonctionnel d'abord », impératif et orienté objet de Microsoft, promet une programmation F# plus simple, uniforme et performante. Publié le 14 novembre avec la plateforme de développement logiciel .NET 8, F# 8 est disponible à la fois dans .NET 8 et dans Visual Studio 2022. « F# 8 est plus cohérent, car il autorise des constructions existantes dans des contextes précédemment interdits », a déclaré Microsoft. Ces changements visent à rendre son utilisation moins confuse par les débutants et à éviter des solutions de contournement, et donc de raccourcir le code.

Parmi les fonctionnalités annoncées du langage, il y a un raccourci pour définir des fonctions lambda simples, utiles quand elle ne fait qu'une expression atomique sur l'argument lambda. Ce raccourci fonctionne pour l'accès à une propriété unique, à une propriété imbriquée, les appels de méthode et les indexeurs. Il peut également être utilisé en dehors d'un appel de fonction pour définir une fonction lambda autonome en vue d'une utilisation ultérieure. Une amélioration de la copie et de la mise à jour des enregistrements imbriqués, ou « nested records », propose aux développeurs d'utiliser la notation pointée pour atteindre les niveaux inférieurs des enregistrements imbriqués et les mettre à jour. « Une fonction while ! présente une approche raffinée des boucles dans les expressions de calcul, minimisant les formalités et maximisant la clarté », a déclaré Microsoft.

Autres fonctionnalités et améliorations de F# 8

En ce qui concerne les performances du compilateur, deux domaines ont fait l'objet d'une attention particulière : les constructions incrémentales de grands graphes de projets via la fonctionnalité ReferenceAssemblies et la parallélisation CPU du processus de compilateur. Pour améliorer l'inlining de la bibliothèque standard FSharp.Core, des changements ont été apportés à l'inlining des fonctions dans les modules Option et ValueOption. Des améliorations de la « qualité de vie » ont également été apportées, par exemple la prise en charge du trimming du code généré par le compilateur, c’est-à-dire la suppression des espaces aux deux extrémités d'une chaîne de caractères. Les unions discriminées et les enregistrements anonymes peuvent désormais être trimmés. Le code utilisant printfn "%A" pour les enregistrements trimmés est désormais trimmable. Depuis la version F# 7, publiée l'année dernière, les diagnostics de F# 8 ont été mis à jour et enrichis de 34 nouvelles erreurs et messages. Il s'agit d'erreurs, avertissements et messages d'information signalés par le compilateur. Dans le travail en cours pour améliorer la récupération de l'analyseur syntaxique (parser), F# 8 active un mode d'indentation stricte, qui respecte les règles d'indentation du langage et signale une erreur dans les scénarios invalides alors que les versions précédentes du langage ne signalaient qu'un avertissement.

Le langage propose la prise en charge des chaînes interpolées existantes, afin de faciliter le travail avec ces chaînes. Les chaînes interpolées simplifient le travail d’incorporation des expressions F# dans des chaînes littérales pour les développeurs. Par ailleurs, des améliorations ont été apportées à l'autocomplétion des enregistrements dans les motifs, des champs d'union dans les motifs et celle des expressions dans les valeurs d'énumération. Les chaînes littérales ont été aussi mises à jour pour pouvoir utiliser des fonctions d'impression intégrées, notamment printfn et sprintfn. Les littéraux numériques peuvent désormais être exprimés à l'aide des opérateurs existants et d'autres littéraux. Le compilateur évalue l'expression au moment de la compilation et stocke la valeur résultante dans l'assemblage produit. La définition de multiples contraintes génériques intersectées à l'aide de types flexibles a été simplifiée. Enfin, le mot-clé fixe, pour l'épinglage de mémoire dans les scénarios de programmation de bas niveau, a été étendu de façon à l’utiliser dans davantage de circonstances, dont tout type 'a lorsque 'a a une méthode d'instance/extension GetPinnableReference : unit -> byref<'t ou GetPinnableReference : unit -> inref< >'t>.