Ramificación condicional.
La bifurcación condicional se expresa en forma de if
expresiones. Una if
expresión consta de una if
cláusula, seguida de cero o más elif
cláusulas y, opcionalmente, un bloque else. Cada cláusula sigue el patrón
keyword condition {
<statements>
}
donde keyword
se reemplaza por if
o elif
respectivamente, condition
es una expresión de tipo Bool
, y <statements>
se va a reemplazar por cero o más instrucciones. El bloque opcional else
consta de la palabra clave else
seguida de cero o más instrucciones entre llaves, {
}
.
Se ejecutará el primer bloque para el cual condition
se evalúe como true
. El bloque else
, si está presente, se ejecuta si ninguna de las condiciones se evalúa como true
. El bloque se ejecuta en su propio ámbito, lo que significa que los enlaces realizados como parte del bloque no son visibles después de que finalice el bloque.
Por ejemplo, supongamos que qubits
es un valor del tipo Qubit[]
, y r1
y r2
son del tipo Result
,
if r1 == One {
let q = qubits[0];
H(q);
}
elif r2 == One {
let q = qubits[1];
H(q);
}
else {
H(qubits[2]);
}
También puede expresar bifurcaciones simples en forma de una expresión condicional.
Restricciones específicas del destino
La estrecha integración entre las construcciones de flujo de control y los cálculos cuánticos supone un desafío para el hardware cuántico actual. Ciertos procesadores cuánticos no admiten la creación de ramas basada en los resultados de la medición. Por lo tanto, la comparación de valores de tipo Result
siempre producirá un error de compilación para los programas de Q# destinados a ejecutarse en dicho hardware.
Otros procesadores cuánticos admiten tipos específicos de creación de ramas en función de los resultados de la medición. Las expresiones más generales if
admitidas en Q# se compilan en instrucciones adecuadas que se pueden ejecutar en dichos procesadores. Las restricciones impuestas son que los valores de tipo Result
solo se pueden comparar como parte de la condición dentro if
de las expresiones en las operaciones. Además, los bloques de ejecución condicional no pueden contener expresiones return
ni actualizar variables mutables declaradas fuera de ese bloque.