局部變量
通過使用let
關鍵字,可以將Q#中的任何類型的值分配給變量,以便在操作或函數內重用。 例如:
let measurementOperator = [PauliX; PauliZ; PauliZ; PauliX; PauliI];
這將Pauli運算符的特定數組分配給稱爲measurementOperator
變量。
Tip
請注意,我們不需要明確指定新變量的類型,因爲let
語句右側的表達式是明確的,並且類型由編譯器推斷。
Q#中的變量是不可變的 ,這意味着一旦以這種方式定義變量,就不能再以任何方式進行更改。 這可以進行多種有益的優化,包括對應用操作的Adjoint
變體進行重新排序的變量的經典邏輯的優化。
如上所述使用let
綁定的變量對於特定範圍是本地的,例如操作的主體或for
循環的內容。
可變性
作爲使用let
創建變量的替代方法, mutable
關鍵字將創建一個特殊的可變變量,可在使用set
關鍵字初始創建後進行更改。 如果一個可變變量是一個數組類型,那麼該數組的元素也可以被改變。 例如,這對於以編程方式創建數組非常有用:
function Squares(nSquares : Int) : Int[] {
mutable squares = new Int[nSquares];
for (idxSquare in 0..nSquares - 1) {
set squares[idxSequare] = idxSquare ^ 2;
}
return squares;
}
上面的例子也說明了Q#中可變性的另一個重要特性:綁定到可變局部變量的數組本身是可變的。 正如我們在討論數組類型時會更詳細地看到的那樣,普通變量不是這樣。 非正式地說,從不可變變量遞減的集合是不可變的,而從可變變量遞減的集合是可變的。
沒有操作或函數調用Squares
可以觀察到局部變量squares
被定義爲可變的; 可變性是調用者不需要擔心的實現細節。 這爲隔離專門功能和操作中的可變性提供了一種重要方法。 特別是,即使使用可變變量的操作不能使用adjoint auto
,操作也可以調用使用可變性的函數。 由於這個原因,使可變性儘可能短而緊湊的函數和操作是一個很好的做法,所以量子程序的其餘部分可以用普通的不可變變量來編寫。
解構
除了分配單個變量之外, let
關鍵字還允許解開元組類型的內容。 據說這種形式的分配解構了該元組的元素。 例如,如果我們用一個元組對一個哈密爾頓算子進行建模,那麼我們可以使用解構來訪問我們需要在該項下模擬的不同數據:
// Represents H = 3.1 X_0 Z_1.
let (coefficient, (paulis, idxQubits)) = (3.1, ([PauliX; PauliZ], [0, 1]));
我們也可以使用解構來訪問用戶定義類型的不同部分:
newtype Quaternion = (Double, Double, Double, Double);
let (realPart, iPart, jPart, kPart) = Quaternion(1.0, -2.0, 3.5, 0.0);