14. Type providers — des données typées à partir d'un échantillon
Sections
Réglages de lecture
Aucune voix pour cette langue dans ce navigateur.
Plus de voix
Code et termes techniques en anglais
Désactivé : la voix de la page lit tout, sans pause entre deux voix.
Aucune voix pour cette langue dans ce navigateur.
Plus de voix
D’autres voix : Microsoft Edge propose des voix naturelles en ligne, et Windows (Paramètres › Heure et langue › Voix), macOS et Android en installent d’autres.
Code : examples/l14_type_providers.fsx, exécuté par le harness avec FSharp.Data 8.2.0.
Des types fournis au compilateur
Section intitulée « Des types fournis au compilateur »Un type provider F# est un composant du compilateur qui expose des types, propriétés et méthodes à partir d’une source d’information. Au lieu de lire une cellule CSV avec row["strings"] puis de la convertir, le compilateur peut proposer row.Strings : int grâce à un échantillon représentatif.
Ce n’est ni de la réflexion à l’exécution, ni une permission de laisser le schéma dériver silencieusement. L’échantillon est inspecté pendant le typage du script ou du projet ; les valeurs lues ensuite doivent toujours respecter cette forme. Microsoft recommande les type providers pour des espaces d’information dont le schéma reste stable pendant la durée de vie du code compilé.
CSV : colonnes et types primitifs inférés
Section intitulée « CSV : colonnes et types primitifs inférés »FSharp.Data fournit des type providers pour CSV, JSON, XML et HTML. Le script épingle la version du package et garde l’échantillon dans le code afin que la compilation ne dépende pas d’un service réseau :
#r "nuget: FSharp.Data, 8.2.0"
open FSharp.Data
type Voicings = CsvProvider<"""name,strings,fretsC major,6,x32010D minor,6,xx0231""">
for row in Voicings.GetSample().Rows do printfn "%s: %d strings, frets %s" row.Name row.Strings row.FretsL’éditeur et le compilateur savent que Name et Frets sont des chaînes et que Strings est un entier. Renommer row.Strings en row.StringCount échoue à la compilation, car l’échantillon ne contient pas cette colonne.
C major: 6 strings, frets x32010D minor: 6 strings, frets xx0231Pour de vraies données, conservez un petit échantillon révisé avec le code, puis appelez Voicings.Load(pathOrUrl) à l’exécution. Le contrat de compilation reste alors déterministe tandis que les données évoluent.
JSON : une structure imbriquée typée
Section intitulée « JSON : une structure imbriquée typée »Le même mécanisme fonctionne pour un événement de gouvernance :
type GovernanceNode = JsonProvider<"""{ "id": "ga.chord-parser", "health": { "resilienceScore": 0.98 }, "tags": ["music", "dsl"] }""">
let node = GovernanceNode.GetSample()printfn "%s: %.2f [%s]" node.Id node.Health.ResilienceScore (String.concat ", " node.Tags)ga.chord-parser: 0.98 [music, dsl]Le type imbriqué Health et le type des éléments du tableau sont également fournis. Un échantillon plus vaste ou hétérogène modifie l’inférence ; FSharp.Data accepte aussi un schéma explicite pour les champs importants.
Providers effacés et génératifs
Section intitulée « Providers effacés et génératifs »La documentation F# distingue deux modèles :
- un provider effacé expose ses types pendant la compilation, sans les émettre comme types .NET ordinaires dans l’assembly ;
- un provider génératif émet des types consommables par d’autres assemblies.
Les providers d’accès aux données de FSharp.Data utilisent le modèle effacé. Vous programmez contre la vue fournie, mais les valeurs d’exécution reposent sur des représentations sous-jacentes. À une frontière publique durable, mappez-les généralement vers vos propres records.
Quand en utiliser un
Section intitulée « Quand en utiliser un »Utilisez un type provider quand l’espace d’information externe est vaste, découvrable et assez stable pour que l’aide du compilateur retire du plumbing répétitif et fragile. Préférez un décodeur ordinaire avec validation quand les schémas varient par tenant, évoluent indépendamment à l’exécution ou doivent produire des erreurs métier précises.
| Question | Type provider | Décodeur + validation |
|---|---|---|
| Échantillon ou schéma stable à la compilation | excellent choix | fonctionne aussi |
| Dérive attendue à l’exécution | fragile | gestion explicite |
| Découverte interactive importante | excellente | manuelle |
| Modèle de domaine public | mapper vers vos records | déjà sous votre contrôle |
Exercice
Section intitulée « Exercice »Ajoutez une colonne difficulty à l’échantillon CSV avec les valeurs easy et medium. Affichez-la pour chaque voicing. Écrivez ensuite volontairement row.Dificulty et constatez que la faute est rejetée avant l’exécution.
Solution
type Voicings = CsvProvider<"""name,strings,frets,difficultyC major,6,x32010,easyD minor,6,xx0231,medium""">
for row in Voicings.GetSample().Rows do printfn "%s: %s" row.Name row.DifficultyÀ retenir
Section intitulée « À retenir »- Un type provider étend le typage à partir d’une source d’information externe stable.
- L’échantillon façonne la compilation ; les données d’exécution doivent encore respecter ce contrat.
- Épinglez le package et gardez les échantillons de compilation locaux et révisables.
- Mappez les valeurs fournies vers des records métier aux frontières publiques durables.