Aufrufausdrücke
Aufrufausdrücke sind ein wichtiger Bestandteil jeder Programmiersprache. Vorgangs- und Funktionsaufrufe können ähnlich wie teilweise Anwendungen überall als Ausdruck verwendet werden, solange der Rückgabewert einen geeigneten Typ aufweist.
Die Nützlichkeit von Aufrufen von Vorgängen in dieser Form liegt in erster Linie im Debuggen, und solche Vorgangsaufrufe sind eines der häufigsten Konstrukte in jedem Q# Programm. Gleichzeitig können Vorgänge nur innerhalb anderer Vorgänge und nicht innerhalb von Funktionen aufgerufen werden. Weitere Informationen finden Sie auch unter Qubits.
Da aufrufbare Werte erstklassige Werte sind, sind Aufrufausdrücke eine generische Möglichkeit, Muster zu unterstützen, die nicht häufig genug sind, um ein eigenes dediziertes Sprachkonstrukt zu verdienen, oder eine dedizierte Syntax wurde (noch) aus anderen Gründen nicht eingeführt. Einige Beispiele für Bibliotheksmethoden, die diesem Zweck dienen, sind ApplyIf
, das einen Vorgang unter der Bedingung aufruft, dass ein klassisches Bit festgelegt ist, ApplyToEach
, das einen bestimmten Vorgang auf jedes Element in einem Array anwendet, und das im folgenden Beispiel gezeigte ApplyWithInputTransformation
.
operation ApplyWithInputTransformation<'TArg, 'TIn>(
fn : 'TIn -> 'TArg,
op : 'TArg => Unit,
input : 'TIn
) : Unit {
op(fn(input));
}
ApplyWithInputTransformation
akzeptiert eine Funktion (fn
), einen Vorgang (op
) und einen Wert (input
) als Argument, wendet die angegebene Funktion auf die Eingabe an und ruft dann den angegebenen Vorgang mit dem von der Funktion zurückgegebenen Wert auf.
Damit der Compiler die Spezialisierungen zur Unterstützung bestimmter Funktionselemente automatisch generieren kann, müssen die aufgerufenen Vorgänge diese Funktionselemente in der Regel ebenfalls unterstützen. Die beiden Ausnahmen sind Aufrufe in äußeren Konjugationsblöcken, die immer den das Funktionselement Adjoint
, aber nie das Funktionselement Controlled
unterstützen müssen, und selbstajungierte Vorgänge, die das Funktionselement Adjoint
unterstützen, ohne zusätzliche Anforderungen an die einzelnen Aufrufe zu stellen.