Volání výrazů
Výrazy volání jsou důležitou součástí každého programovacího jazyka. Volání operací a funkcí, podobně jako částečné aplikace, se dají použít jako výraz kdekoli, pokud je vrácená hodnota vhodného typu.
Užitečnost volání operací v této formě spočívá především v ladění a taková volání operací jsou jedním z nejběžnějších konstruktorů v libovolném Q# programu. Současně lze operace volat pouze z jiných operací, a ne z funkcí. Další informace najdete také v tématu Qubits.
Protože volatelné položky jsou hodnoty první třídy, představují výrazy volání obecný způsob podpory vzorů, které nejsou dostatečně běžné, aby si zasloužily vlastní konstruktor vyhrazeného jazyka, nebo vyhrazená syntaxe nebyla (zatím) zavedena z jiných důvodů. Některé příklady metod knihovny, které slouží k tomuto účelu, jsou ApplyIf
, který vyvolá operaci podmíněnou nastavením klasického bitu; ApplyToEach
, který použije danou operaci na každý prvek v poli; a ApplyWithInputTransformation
, jak je znázorněno v následující ukázce.
operation ApplyWithInputTransformation<'TArg, 'TIn>(
fn : 'TIn -> 'TArg,
op : 'TArg => Unit,
input : 'TIn
) : Unit {
op(fn(input));
}
ApplyWithInputTransformation
přebírá funkci fn
, operaci op
a hodnotu jako argumenty a potom použije danou input
funkci na vstup před vyvoláním dané operace s hodnotou vrácenou z funkce.
Aby kompilátor automaticky vygeneroval specializace pro podporu konkrétních funktorů, obvykle vyžaduje, aby tyto funkce podporovaly i volané operace. Dvěma výjimkami jsou volání ve vnějších blocích konjugací, která vždy potřebují podporovat Adjoint
functor, ale nikdy nemusí podporovat Controlled
functor, a samostatné operace, které podporují Adjoint
functor, aniž by na jednotlivá volání uložily další požadavky.