Iterationen

Schleifen, die eine Sequenz von Werten durchlaufen, werden in Q# als for-Schleifen ausgedrückt. Eine for-Schleife in Q# wird nicht basierend auf einer Bedingung unterbrochen, sondern entspricht stattdessen einer Iteration oder dem, was in anderen Programmiersprachen häufig als foreach oder iter ausgedrückt wird. Es gibt derzeit zwei Datentypen in Q#, die Iterationen unterstützen: Arrays und Bereiche.

Der Ausdruck besteht aus dem Schlüsselwort (keyword) for, gefolgt von einem Symbol- oder Symboltupel, dem Schlüsselwort (keyword) in, einem Ausdruck des Arrays oder Range Typs und einem Anweisungsblock.

Der Anweisungsblock (der Text der Schleife) wird wiederholt ausgeführt – mit einer oder mehreren Schleifenvariablen, die an die einzelnen Werte im Bereich oder Array gebunden sind. Die gleichen Dekonstruktionsregeln gelten für die definierten Schleifenvariablen, genau wie für jede andere Variablenzuweisung (beispielsweise Bindungen in let-, mutable-, set-, use- und borrow-Anweisungen). Die Schleifenvariablen selbst sind unveränderlich gebunden, können nicht innerhalb des Schleifenkörpers neu zugewiesen werden und verlassen bei Beendigung der Schleife den Bereich. Der Ausdruck, den die Schleife durchläuft, wird vor dem Eintritt in die Schleife vollständig ausgewertet und ändert sich nicht, während die Schleife ausgeführt wird.

Dies wird im folgenden Beispiel veranschaulicht. Angenommen, qubits ist ein Wert vom Typ Qubit[]. Dann gilt:

for qubit in qubits {
    H(qubit);
}

mutable results : (Int, Result)[] = [];
for index in 0 .. Length(qubits) - 1 {
    set results += [(index, M(qubits[index]))];
}

mutable accumulated = 0;
for (index, measured) in results {
    if measured == One {
        set accumulated += 1 <<< index;
    }
}

Zielspezifische Einschränkungen

Da es in Q# keine break- oder continue-Primitiven gibt, ist die Länge der Schleife bekannt, sobald der Iterationswert bekannt ist. Somit können for-Schleifen auf jeder Quantenhardware ausgeführt werden.