如 量子位數據類型的描述所詳細說明,量子計算會以原生支援於目標量子處理器的作業副作用的形式執行。 事實上,這些是 Q#中唯一的副作用。 由於所有類型都 不可變,因此不會對 Q#中明確表示的值造成任何副作用。 因此,只要特定可呼叫的實作不會直接或間接呼叫任何原生實作的作業,其執行一律會產生相同的輸出,前提是相同的輸入。
Q# 可讓您明確地將這類純決定性計算分割成 函式,。 由於原生支援的指令集不是固定的,而且內建於語言本身,而是完全可設定且以 Q# 連結庫表示,因此確定性可保證函式只能呼叫其他函式,而且無法呼叫任何作業。 此外,不具決定性的原生指令,也就是說,因為它們會影響量子狀態,會以作業表示。 透過這兩個限制,函式可以在已知輸入值後立即進行評估,而且原則上,永遠不需要針對相同的輸入評估一次以上。
因此,Q# 區分兩種類型的 可呼叫專案:作業和函式。 所有可呼叫者都會接受單一自變數(可能為 Tuple 值),做為輸入,併產生單一值 (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 語句中 部分套用。
作業特性
除了輸入和輸出類型的相關信息之外,作業類型也包含作業特性的相關信息。 例如,這項資訊描述作業所支援的函式。 此外,內部表示法也包含編譯程式推斷的優化相關信息。
作業的特性是一組預先定義且內建的標籤。 這些表達式是以屬於類型簽章一部分的特殊表達式形式表示。 表達式包含其中一組預先定義的標籤,或透過支援的二進位運算子組合特性表達式。
有兩個預先定義的集合,Adj 和 Ctl。
-
Adj是包含單一標籤的集合,指出作業是相鄰的,這表示它支援Adjoint函式,而且套用的量子轉換可以「復原」,也就是說,它可以反轉。 -
Ctl是包含單一卷標的集合,指出作業是可控制的,這表示它支援Controlled函式,而且其執行可以依其他量子位的狀態進行條件。
作為特性運算式一部分支援的兩個運算子是集合聯集 + 和集合交集 *。
在 EBNF 中 (外延的Backus–Naur形式),
predefined = "Adj" | "Ctl";
characteristics = predefined
| "(", characteristics, ")"
| characteristics ("+"|"*") characteristics;
如預期,* 的優先順序高於 +,且兩者都是左關聯。 例如,單位運算的類型會以 <TIn> => <TOut> is Adj + Ctl表示,其中 <TIn> 應取代為 operation 自變數的類型,<TOut> 以傳回值的類型取代。
備註
指出此表單中作業的特性有兩個主要優點:一是可以引進新的標籤,而不需針對所有標籤組合使用指數級許多語言關鍵詞。 更重要的是,使用表達式來指出作業的特性,也支持未來作業特性的參數化。