Anropa uttryck
Anropsuttryck är en viktig del av alla programmeringsspråk. Åtgärds- och funktionsanrop, ungefär som partiella program, kan användas som ett uttryck var som helst så länge det returnerade värdet är av lämplig typ.
Nyttan med att anropa åtgärder i det här formatet är främst felsökning, och sådana åtgärdsanrop är en av de vanligaste konstruktionerna i alla Q# program. Samtidigt kan åtgärder bara anropas inifrån andra åtgärder och inte inifrån funktioner. Mer information finns i även Qubits.
Med anropsbara värden som förstklassiga värden är anropsuttryck ett allmänt sätt att stödja mönster som inte är tillräckligt vanliga för att förtjäna sin egen dedikerade språkkonstruktion, eller så har inte dedikerad syntax (ännu) introducerats av andra skäl. Några exempel på biblioteksmetoder som tjänar det syftet är ApplyIf
, som anropar en åtgärd som är villkorad av att en klassisk bit anges, ApplyToEach
, som tillämpar en viss åtgärd på varje element i en matris, och ApplyWithInputTransformation
, enligt följande exempel.
operation ApplyWithInputTransformation<'TArg, 'TIn>(
fn : 'TIn -> 'TArg,
op : 'TArg => Unit,
input : 'TIn
) : Unit {
op(fn(input));
}
ApplyWithInputTransformation
tar en funktion fn
, en åtgärd op
och ett input
värde som argument och tillämpar sedan den angivna funktionen på indata innan den angivna åtgärden anropas med det värde som returneras från funktionen.
För att kompilatorn ska kunna generera specialiseringarna automatiskt för att stödja vissa functors kräver det vanligtvis att de anropade åtgärderna också stöder dessa kultorer. De två undantagen är anrop i yttre block av konjugationer, som alltid behöver stödja Adjoint
functor men aldrig behöver stödja Controlled
functor och självanslutna åtgärder, som stöder Adjoint
functor utan att införa några ytterligare krav på de enskilda samtalen.