F # - Génériques

Les génériques vous permettent de retarder la spécification du type de données des éléments de programmation dans une classe ou une méthode, jusqu'à ce qu'il soit réellement utilisé dans le programme. En d'autres termes, les génériques vous permettent d'écrire une classe ou une méthode qui peut fonctionner avec n'importe quel type de données.

Vous écrivez les spécifications de la classe ou de la méthode, avec des paramètres de substitution pour les types de données. Lorsque le compilateur rencontre un constructeur pour la classe ou un appel de fonction pour la méthode, il génère du code pour gérer le type de données spécifique.

En F #, les valeurs de fonction, les méthodes, les propriétés et les types d'agrégats tels que les classes, les enregistrements et les unions discriminées peuvent être génériques.

Les constructions génériques contiennent au moins un paramètre de type. Les fonctions et types génériques vous permettent d'écrire du code qui fonctionne avec une variété de types sans répéter le code pour chaque type.

Syntaxe

La syntaxe pour écrire une construction générique est la suivante -

// Explicitly generic function.
let function-name<type-parameters> parameter-list =
   function-body

// Explicitly generic method.
[ static ] member object-identifer.method-name<type-parameters> parameter-list [ return-type ] =
   method-body

// Explicitly generic class, record, interface, structure,
// or discriminated union.
type type-name<type-parameters> type-definition

Exemples

(* Generic Function *)
let printFunc<'T> x y =
   printfn "%A, %A" x y

printFunc<float> 10.0 20.0

Lorsque vous compilez et exécutez le programme, il produit la sortie suivante -

10.0, 20.0

Vous pouvez également rendre une fonction générique en utilisant la syntaxe des guillemets simples -

(* Generic Function *)
let printFunction (x: 'a) (y: 'a) =
   printfn "%A %A" x y

printFunction 10.0 20.0

Lorsque vous compilez et exécutez le programme, il produit la sortie suivante -

10.0 20.0

Veuillez noter que lorsque vous utilisez des fonctions ou des méthodes génériques, vous n'aurez peut-être pas à spécifier les arguments de type. Cependant, en cas d'ambiguïté, vous pouvez fournir des arguments de type entre crochets comme nous l'avons fait dans le premier exemple.

Si vous avez plus d'un type, vous séparez les arguments de type par des virgules.

Classe générique

Comme les fonctions génériques, vous pouvez également écrire des classes génériques. L'exemple suivant illustre ceci -

type genericClass<'a> (x: 'a) =
   do printfn "%A" x

let gr = new genericClass<string>("zara")
let gs = genericClass( seq { for i in 1 .. 10 -> (i, i*i) } )

Lorsque vous compilez et exécutez le programme, il produit la sortie suivante -

"zara"
seq [(1, 1); (2, 4); (3, 9); (4, 16); ...]