Partage via


Expressions d’appel

Les expressions d’appel sont une partie importante de tout langage de programmation. Les appels d’opération et de fonction, comme les applications partielles, peuvent être utilisés comme une expression partout où la valeur renvoyée a le type approprié.

L’utilité de l’appel d’opérations sous cette forme réside principalement dans le débogage, et ces appels d’opération sont l’une des constructions les plus courantes dans n’importe quel Q# programme. En même temps, les opérations peuvent être appelées seulement à partir d’autres opérations et non à partir de fonctions. Pour plus d’informations, consultez également Qubits.

Les callables étant des valeurs de première classe, les expressions d’appel sont un moyen générique de prendre en charge des modèles qui ne sont pas assez courants pour mériter leur propre construction de langage dédié, ou la syntaxe dédiée n’a pas (encore) été introduite pour d’autres raisons. Les exemples suivants sont des méthodes de bibliothèque qui remplissent cette fonction : ApplyIf, qui appelle une opération conditionnelle sur un bit classique en cours de définition, ApplyToEach, qui applique une opération donnée à chaque élément d’un tableau, et ApplyWithInputTransformation, illustré dans l’exemple suivant.

    operation ApplyWithInputTransformation<'TArg, 'TIn>(
        fn : 'TIn -> 'TArg,
        op : 'TArg => Unit,
        input : 'TIn
    ) : Unit {

        op(fn(input));
    }

ApplyWithInputTransformation prend une fonction fn, une opération op et une valeur input comme argument, puis applique la fonction donnée à l’entrée, avant d’appeler l’opération donnée avec la valeur retournée par la fonction.

Pour que le compilateur puisse générer automatiquement les spécialisations afin de prendre en charge des foncteurs particuliers, il faut généralement que les opérations appelées prennent également en charge ces foncteurs. Les deux exceptions sont les appels dans les blocs externes de conjugaisons, qui doivent toujours prendre en charge le foncteur Adjoint mais jamais le foncteur Controlled, et les opérations auto-adjointes, qui prennent en charge le foncteur Adjoint sans imposer d’exigences supplémentaires sur les appels individuels.