条件分岐
条件分岐は、if
式の形式で表されます。
if
式は、if
句の後に 0 個以上の elif
句と、必要に応じて else-block で構成されます。 各句はパターンに従います
keyword condition {
<statements>
}
ここで、keyword
はそれぞれ if
または elif
に置き換えられ、condition
は Bool
型の式であり、<statements>
は 0 個以上のステートメントに置き換えられます。 省略可能な else
-block は、キーワード else
の後に中かっこで囲まれた 0 個以上のステートメントで構成 {
}
。
condition
が true
に評価される最初のブロックが実行されます。
else
ブロックが存在する場合、どの条件も true
と評価されない場合に実行されます。 ブロックは独自のスコープで実行されます。つまり、ブロックの一部として行われたバインドは、ブロックの終了後は表示されません。
たとえば、qubits
が Qubit[]
型の値であり、r1
と r2
が Result
型であるとします。
if r1 == One {
let q = qubits[0];
H(q);
}
elif r2 == One {
let q = qubits[1];
H(q);
}
else {
H(qubits[2]);
}
また、単純な分岐を 条件式の形式で表現することもできます。
ターゲット固有の制限
制御フロー コンストラクトと量子計算の緊密な統合は、現在の量子ハードウェアにとって課題となります。 特定の量子プロセッサでは、測定結果に基づく分岐がサポートされていません。 そのため、Result
型の値を比較すると、常に、このようなハードウェアで実行する対象 Q# プログラムのコンパイル エラーが発生します。
その他の量子プロセッサでは、測定結果に基づく特定の種類の分岐がサポートされています。
Q# でサポートされるより一般的な if
式は、そのようなプロセッサで実行できる適切な命令にコンパイルされます。 制限が課せられるのは、Result
型の値は、演算の式内の条件の一部としてのみ比較 if
。 さらに、条件付き実行ブロックには、return
式を含めたり、そのブロックの外部で宣言されている変更可能な変数を更新したりすることはできません。