Paramètres de type résolus statiquement (F#)
Un paramètre de type résolu statiquement est un paramètre de type remplacé par un type réel au moment de la compilation plutôt qu'au moment de l'exécution. Ces paramètres sont précédés d'un signe insertion (^).
ˆtype-parameter
Notes
En langage F#, il existe deux genres distincts de paramètres de type. Le premier genre est le paramètre de type générique standard. Ce genre est indiqué par une apostrophe ('), comme dans 'T et 'U. Ces paramètres sont équivalents aux paramètres de type générique d'autres langages .NET Framework. L'autre genre est le paramètre de type résolu statiquement, qui est indiqué par un signe insertion, comme dans ^T et ^U.
Les paramètres de type résolus statiquement sont essentiellement utiles conjointement aux contraintes de membre, qui sont des contraintes qui vous permettent de spécifier qu'un argument de type doit avoir un ou des membres particuliers pour être utilisé. Il est impossible de créer ce genre de contrainte à l'aide d'un paramètre de type générique normal.
Le tableau suivant résume les ressemblances et les différences entre les deux genres de paramètres de type.
Fonctionnalité |
Générique |
Résolu statiquement |
---|---|---|
Syntaxe |
'T, 'U |
^T, ^U |
Résolution |
Au moment de l'exécution |
Au moment de la compilation |
Contraintes de membre |
Ne peut pas être utilisé avec les contraintes de membre. |
Peut être utilisé avec les contraintes de membre. |
Génération de code |
Un type (ou une méthode) avec des paramètres de type générique standard entraîne la génération d'un type ou d'une méthode générique unique. |
Plusieurs instanciations de types et de méthodes sont générées ; une pour chaque type nécessaire. |
Utilisation avec les types |
Peut être utilisé sur les types. |
Ne peut pas être utilisé sur les types. |
Utilisation avec les fonctions inline |
Non. Une fonction inline n'est pas paramétrable avec un paramètre de type générique standard. |
Oui. Les paramètres de type résolus statiquement ne peuvent pas être utilisés sur les fonctions ou méthodes qui ne sont pas inline. |
De nombreuses fonctions de la bibliothèque principale F#, notamment les opérateurs, ont des paramètres de type résolus statiquement. Ces fonctions et opérateurs sont inline et entraînent la génération de code efficace pour les calculs numériques.
Les méthodes et fonctions inline qui utilisent des opérateurs, ou utilisent d'autres fonctions qui ont des paramètres de type résolus statiquement, peuvent également elles-mêmes utiliser des paramètres de type résolus statiquement. Souvent, l'inférence de type déduit que ces fonctions inline ont des paramètres de type résolus statiquement. L'exemple suivant illustre une définition d'opérateur déduite comme ayant un paramètre de type résolu statiquement.
let inline (+@) x y = x + x * y
// Call that uses int.
printfn "%d" (1 +@ 1)
// Call that uses float.
printfn "%f" (1.0 +@ 0.5)
Le type résolu de (+@) est basé sur l'utilisation de (+) et de (*), qui amènent l'inférence de type à déduire des contraintes de membre sur les paramètres de type résolus statiquement. Le type résolu, comme indiqué dans l'interpréteur F#, est comme suit.
^a -> ^c -> ^d
when (^a or ^b) : (static member (+) : ^a * ^b -> ^d) and
(^a or ^c) : (static member (+) : ^a & ^c -> ^b)
La sortie est la suivante.
2
1.500000