L' inline
mot-clé indique que la définition d'une fonction doit être insérée en ligne dans n'importe quel code qui l'utilise. La plupart du temps, cela n'aura pas d'effet sur le type de la fonction. Cependant, dans de rares cas, elle peut conduire à une fonction qui a un type plus général, car il y a des contraintes qui ne peuvent être exprimées sous la forme compilée du code .NET, mais qui peut être appliquée lorsque la fonction est insérée.
Le principal cas où cela s'applique au niveau des opérateurs.
let add a b = a + b
aura un monomorphe type inféré (probablement en int -> int -> int
, mais il pourrait être quelque chose comme float -> float -> float
si vous disposez d'un code qui utilise cette fonction à ce type de lieu). Toutefois, en marquant cette fonction inline, le compilateur F# déduit un type polymorphe:
let inline add a b = a + b
// add has type ^a -> ^b -> ^c when ( ^a or ^b) : (static member ( + ) : ^a * ^b -> ^c)
Il n'existe aucun moyen pour coder ce type de contrainte dans une classe de première façon dans le code compilé sur .NET. Cependant, le compilateur F# peut appliquer cette contrainte sur le site où il inlines la fonction, de sorte que tous les opérateur utilise sont résolus au moment de la compilation.
Les paramètres de type ^a
, ^b
, et ^c
sont "statiquement réglé les paramètres de type", ce qui signifie que les types des arguments doit être connu statiquement à l'endroit où ces paramètres sont utilisés. Ceci est en contraste à la normale des paramètres de type (par exemple, 'a
, 'b
, etc.), où les paramètres signifier quelque chose comme "un type qui sera fourni plus tard, mais qui peut être n'importe quoi".