- Pourquoi F# 9 est important : F# 9 introduit un large ensemble d’améliorations qui rendent les programmes plus sûrs, plus robustes et plus performants
Types de référence nullable
- F# a été conçu pour éviter
null, mais null peut s’introduire lors de l’interfaçage avec des bibliothèques .NET écrites en C#
- Désormais, F# permet de traiter de façon sûre au niveau du typage les types de référence pour lesquels
null est une valeur valide
- Exemples :
let notAValue: string | null = null
let len (str: string | null) = match str with | null -> -1 | NonNull s -> s.Length
Propriétés .Is* des discriminated unions
- Les discriminated unions disposent désormais de propriétés générées automatiquement pour chaque cas
- Cela permet de vérifier si une valeur correspond à un cas particulier
- Par exemple, il est possible d’écrire
person.contact.IsEmail
Les partial active patterns peuvent renvoyer un bool au lieu de unit option
- Auparavant, les partial active patterns renvoyaient
Some () en cas de correspondance, sinon None
- Désormais, ils peuvent aussi renvoyer un bool
Préférence pour les méthodes d’extension plutôt que les propriétés intégrées quand des arguments sont fournis
- F# résout désormais les méthodes d’extension définies avec le même nom qu’une propriété intégrée du type
- Cela correspond à un modèle présent dans certaines bibliothèques .NET
Prise en charge des computation expressions à corps vide
- F# prend désormais en charge les computation expressions vides
- Exemple :
let xs = seq { }
- Cela entraîne l’appel de la méthode
Zero du builder
Les directives de préprocesseur acceptent des arguments non textuels
- Auparavant, les directives de préprocesseur destinées au compilateur n’acceptaient que des arguments de type chaîne passés entre guillemets
- Désormais, elles peuvent recevoir des arguments de tout type
- Exemple :
#nowarn 0070
Extension de la directive #help dans fsi
- La directive
#help de F# Interactive affiche désormais la documentation de l’objet ou de la fonction fournie
- Elle peut être utilisée sans guillemets
- Exemple :
#help List.map;;
Prise en charge du préfixe FS dans #nowarn pour désactiver des avertissements
- Auparavant, écrire
#nowarn "FS0057" produisait un message indiquant un numéro d’avertissement invalide
- Désormais, le numéro d’avertissement est accepté même avec son préfixe
Avertissement en cas d’utilisation de l’attribut TailCall sur une fonction non récursive ou une valeur liée par let
- F# émet désormais un avertissement si l’attribut
[<TailCall>] est utilisé au mauvais endroit
- Cela n’a pas d’impact sur le code, mais peut prêter à confusion pour les lecteurs
Application des cibles d’attributs
- Le compilateur applique désormais correctement les
AttributeTargets aux valeurs let, fonctions, déclarations de cas d’union, constructeurs implicites, structures et classes
- Cela peut éviter des bugs, par exemple oublier d’ajouter un argument
unit à des tests Xunit
Mise à jour de la bibliothèque standard
Fonctions Random pour les collections
- Les modules List, Array et Seq reçoivent de nouvelles fonctions pour l’échantillonnage aléatoire et le mélange
- Une version qui utilise une instance partagée de
Random, implicite et thread-safe
- Une version qui reçoit une instance
Random en argument
- Une version qui reçoit une fonction de randomisation personnalisée
- Les fonctions disponibles sont Shuffle, Choice, Choices et Sample
Constructeur sans paramètre de CustomOperationAttribute
- Il devient plus simple de créer des opérations personnalisées pour les builders de computation expression
- Il n’est plus nécessaire de nommer explicitement l’opération (dans la plupart des cas, le nom correspond à celui de la méthode)
Prise en charge des collection expressions C# pour F# List et Set
- Lorsqu’on utilise
F# List et Set depuis C#, il est désormais possible de les initialiser avec des collection expressions
- Exemple :
FSharpSet<int> mySet = [ 1, 2, 3 ];
Gains de productivité pour les développeurs
Récupération du parseur
- Des améliorations continues ont été apportées à la récupération du parseur
- Les outils continuent ainsi de fonctionner pendant l’édition du code, même lorsqu’il n’est pas toujours syntaxiquement correct
Diagnostics
- F# 9 comprend de nombreux messages de diagnostic nouveaux ou améliorés
- Notamment pour les méthodes d’override ambiguës, l’utilisation de membres abstraits, ou les unions avec des champs dupliqués
Visibilité réelle
- La manière dont F# génère les assemblys posait un problème : les membres
private étaient écrits comme internal dans l’IL
- Il est désormais possible de corriger ce comportement avec l’option du compilateur
--realsig+
Améliorations des performances
Vérification d’égalité optimisée
- La vérification d’égalité est désormais plus rapide et réduit les allocations mémoire
Partage de champs dans les discriminated unions de type struct
- Si plusieurs cas d’une DU struct possèdent des champs de même nom et de même type, ils peuvent partager le même emplacement mémoire
- Cela réduit l’empreinte mémoire de la structure
Optimisation des plages d’entiers
- Le compilateur génère désormais du code optimisé pour davantage d’instances des expressions
start..finish et start..step..finish
- Auparavant, l’optimisation ne s’appliquait que lorsque le type était
int/int32 et que le pas était la constante 1 ou -1
- Désormais, tous les types entiers et d’autres valeurs de pas sont aussi optimisés
Optimisation de for x in xs -> ... dans les compréhensions List/Array
for x in xs -> ... a été optimisé dans les compréhensions List et Array
- En particulier pour Array, avec jusqu’à 10x de gain de vitesse et une réduction des allocations à environ 1/3 ou 1/4
Améliorations des outils
Live Buffer dans Visual Studio
- C’était auparavant une fonctionnalité optionnelle, mais elle est désormais activée par défaut
- Le compilateur en arrière-plan de l’IDE fonctionne maintenant avec le buffer vivant du fichier
- Il n’est plus nécessaire d’enregistrer le fichier sur disque pour appliquer les modifications
Analyseur et correctif pour supprimer les parenthèses inutiles
- Des parenthèses supplémentaires sont parfois utilisées pour la clarté, mais elles ne sont parfois que du bruit
- Visual Studio propose désormais un correctif de code pour les supprimer
Prise en charge des visualiseurs personnalisés pour F# dans Visual Studio
- Les visualiseurs du débogueur de Visual Studio fonctionnent désormais dans les projets F#
Affichage de l’aide de signature au milieu d’un pipeline
- Auparavant, aucune aide de signature n’était fournie lorsqu’une fonction au milieu d’un pipeline avait déjà reçu des paramètres curryfiés complexes, comme des lambdas
- Désormais, une infobulle de signature est affichée pour le paramètre suivant
1 commentaires
Avis Hacker News
F# est ma langue préférée depuis que je l’ai découverte à l’université. Elle dispose de fonctionnalités en avance sur C#, et même si C# les adopte aussi, cela reste difficile à cause des problèmes de compatibilité. F# reste un excellent langage, compatible avec l’écosystème .NET, et peut offrir des performances équivalentes à C# avec moins de boilerplate
F# est l’un des meilleurs produits que Microsoft ait sortis depuis Excel, et il a transformé .NET en plateforme raisonnable
Nous avons beaucoup investi dans le projet Phosphor basé sur F#, mais nous avons fini par tout réécrire en Typescript et en Rust. Nous avons essayé de préserver la sûreté de typage entre différentes technologies via la bibliothèque Fable, mais les problèmes d’interopérabilité entre bibliothèques et la gestion des dépendances étaient difficiles. Je pense que F# n’est adapté que lorsqu’il existe une séparation frontend/backend traditionnelle
Dans un cours de cryptographie où l’on pouvait choisir un langage utilisant .NET, les devoirs que j’ai écrits en F# étaient plus lisibles que ceux des autres. Je ne peux pas utiliser davantage F#, car presque 100 % du travail en data science se fait en Python
Travailler en F# me manque, mais je continue de suivre les mises à jour. Les outils étaient assez bons malgré la taille de la communauté et le manque d’intérêt de Microsoft. Le plus gros problème était la précision de la couverture des tests de code
J’ai récemment essayé F#, et venant de Python, j’aime le fait de pouvoir utiliser un REPL. J’aimerais créer un petit projet de backend web cet hiver pour mieux connaître le langage et l’écosystème. J’ai entendu de bonnes choses sur Oxpecker pour la partie http
Je me demande comment fonctionne la gestion des versions de F#. Il y a beaucoup d’améliorations de qualité, mais cela ne semble pas nécessiter de changement de version majeure. Je me demande si c’est pour aligner la numérotation sur .NET9
Je me demande où en est F# comme alternative à C# pour créer des applications GUI sous Windows, et s’il existe des entreprises qui l’utilisent dans ce but
Je n’ai jamais essayé F#, mais j’ai trouvé un site qui semble être une bonne ressource : fsharpforfunandprofit.com
Je me demande quel est l’état de F# sur Linux/MacOS. Je voudrais savoir si c’est réservé à Windows, ou si cela donne l’impression d’un langage pleinement pris en charge