Condividi tramite


Espressioni di chiamata

Le espressioni di chiamata sono una parte importante di qualsiasi linguaggio di programmazione. Le chiamate di operazione e funzione, molto simili a applicazioni parziali, possono essere usate come espressione ovunque, purché il valore restituito sia di un tipo appropriato.

L'utilità delle operazioni di chiamata in questo formato si trova principalmente nel debug e tali chiamate di operazione sono uno dei costrutti più comuni in qualsiasi Q# programma. Allo stesso tempo, le operazioni possono essere chiamate solo da altre operazioni e non dall'interno di funzioni. Per altre informazioni, vedere anche Qubits.

Con i chiamabili che sono valori di prima classe, le espressioni di chiamata sono un modo generico di supportare i modelli che non sono abbastanza comuni per meritare il proprio costrutto di linguaggio dedicato o la sintassi dedicata non è ancora stata introdotta per altri motivi. Alcuni esempi di metodi di libreria che servono a tale scopo sono ApplyIf, che richiama un'operazione condizionale su un bit classico impostato; ApplyToEach, che applica un'operazione specificata a ogni elemento in una matrice e , ApplyWithInputTransformationcome illustrato nell'esempio seguente.

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

        op(fn(input));
    }

ApplyWithInputTransformationaccetta una funzione , un'operazione e un input valore come argomenti e quindi applica la funzione fnspecificata all'input prima di richiamare l'operazione opspecificata con il valore restituito dalla funzione.

Affinché il compilatore generi automaticamente le specializzazioni per supportare specifici functor, in genere richiede che le operazioni chiamate supportino anche tali functor. Le due eccezioni sono chiamate in blocchi esterni dijugazioni, che devono sempre supportare il functor, ma non devono mai supportare le Controlled operazioni functor e auto-adiacenti, che supportano il AdjointAdjoint functor senza imporre requisiti aggiuntivi alle singole chiamate.