79 votes

Utilisation de `inline` en fa #

Le mot-clé inline dans F # me semble avoir un objectif quelque peu différent de celui auquel je suis habitué, par exemple C. Par exemple, il semble affecter le type d'une fonction (que sont les "paramètres de type résolus statiquement") ? Tous les types F # ne sont-ils pas résolus de manière statique?)

Quand devrais-je utiliser les fonctions inline ?

88voto

kvb Points 35490

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".

36voto

Jon Harrop Points 26951

Quand devrais-je utiliser inline fonctions?

Le plus précieux de l'application de l' inline mot-clé dans la pratique est inline fonctions d'ordre supérieur à l'appel site où leurs arguments de la fonction sont également intégrées dans le but de produire un seul entièrement optimisé morceau de code.

Par exemple, l' inline dans le suivant, fold fonction, 5× plus rapide:

  let inline fold f a (xs: _ []) =
     let mutable a = a
     for i=0 to xs.Length-1 do
        a <- f a xs.[i]
     a

Notez que cela ne ressemble guère à ce qu' inline dans la plupart des autres langues. Vous pouvez obtenir un effet similaire à l'aide du modèle de la métaprogrammation en C++, mais F# peut aussi en ligne entre compilé les assemblées, car inline est véhiculée par la .NET de métadonnées.

11voto

Brian Points 82719

Le F# composant les lignes directrices de conception pour ne mentionner qu'un tout petit peu. Ma recommandation (qui correspond bien à ce qui est dit là) est:

  • Ne pas utiliser inline
    • Exception: vous pouvez envisager d'utiliser inline lors de l'écriture de bibliothèques mathématiques à être consommés par d'autres code F# et que vous voulez écrire des fonctions qui sont génériques sur les différents types de données numériques.

Il ya beaucoup d'autres "intéressant" utilise en ligne et membre statique des contraintes pour les "duck typing" types de scénarios qui fonctionnent un peu comme les modèles C++. Mon conseil est d'éviter de tout cela comme la peste.

@kvb la réponse va plus en profondeur dans ce que statique des contraintes de type' sont.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X