作業和函式

量子位數據類型的描述更詳細地說明,量子計算會以目標量子處理器上原生支援的作業副作用形式執行。 事實上,這些是 中唯一的 Q#副作用。 由於所有類型都是 不可變的,因此沒有任何副作用會影響 中 Q#明確表示的值。 因此,只要特定可呼叫的實作不會直接或間接呼叫上述任何原生實作的作業,其執行一律會產生相同的輸出,並指定相同的輸入。

Q# 可讓您明確地將這類純決定性計算分割成 函式。 由於原生支援的指令集不是固定的,而且內建於語言本身,而是可完全設定並以連結庫表示 Q# ,因此要求函式只能呼叫其他函式,而且無法呼叫任何作業來保證決定性。 此外,不具決定性的原生指令,也就是說,因為它們會影響量子狀態,所以會以作業表示。 使用這兩項限制時,只要知道函式的輸入值即可進行評估,而且基本上,永遠不需要針對相同的輸入評估一次以上。

Q# 因此,區分兩種類型的 可呼叫專案:作業和函式。 所有可呼叫者都會採用單一自變數, (可能的 Tuple 值) 作為輸入,並產生單一值 (元組) 作為輸出。 在語法上,作業類型會以 <TIn> => <TOut> is <Char> 表示,其中 <TIn> 會取代為引數類型,<TOut> 會取代為傳回類型,而 <Char> 會取代為作業特性。 如果不需要指定任何特性,則語法會簡化為 <TIn> => <TOut>。 同樣地,函式類型會以 <TIn> -> <TOut> 表示。

除了此決定性保證之外,作業和函式之間沒有差異。 兩者都是可以自由傳遞的第一級值;它們可以當做其他可呼叫對象的傳回值或自變數使用,如下列範例所示:

function Pow<'T>(op : 'T => Unit, pow : Int) : 'T => Unit {
    return PowImpl(op, pow, _);
}

這兩者都可以根據型別參數化定義來具現化,例如上述類型參數化Pow式,而且可以在範例的語句中return部分套用

作業特性

除了輸入和輸出類型的相關信息之外,作業類型還包含作業特性的相關信息。 例如,這項資訊描述作業支援哪些函式。 此外,內部表示法也包含編譯程式推斷的優化相關信息。

作業特性是一組預先定義的內建標籤, 並會以特殊運算式形式 (屬於類型簽章的一部分) 來表示。 運算式的組成可能是其中一組預先定義的標籤,或透過所支援二元運算子形成的特性運算式組合。

AdjCtl 這兩組預先定義的集合。

  • Adj 是包含單一標籤的集合,指出作業是相鄰的,這表示它支援 Adjoint 式,而套用的量子轉換可以是「復原」,也就是可以反轉。
  • Ctl 是包含單一標籤的集合,指出作業是可控制的,這表示它支援 Controlled 運算函 式,而且其執行可以依據其他量子位的狀態來設定。

在特性運算式中支援的兩個運算子是集合聯集 + 和集合交集 *。 在 EBNF 中,

    predefined = "Adj" | "Ctl";
    characteristics = predefined 
        | "(", characteristics, ")" 
        | characteristics ("+"|"*") characteristics;

如同預期,* 其優先順序高於 + 且兩者都是左向關聯。 例如,單位運算的類型是以 表示 <TIn> => <TOut> is Adj + Ctl,其中 <TIn> 應該以 operation 自變數的類型取代,並以 <TOut> 傳回值的型別取代。

注意

以這種形式來表示作業特性有兩大優點;其中之一是可以引進新標籤,而不會因所有標籤組合呈指數衍生許多語言關鍵字。 或許更重要的是,使用表達式來指出作業的特性,也支持未來對作業特性進行參數化。