copy-and-update-Ausdrücke
Q# unterstützt Copy-and-Update-Ausdrücke für Werttypen mit Elementzugriff, um die Notwendigkeit veränderbarer Bindungen zu reduzieren. Benutzerdefinierte Typen und Arrays sind unveränderlich und fallen in diese Kategorie. Benutzerdefinierte Typen ermöglichen den Zugriff auf Elemente über den Namen, während Arrays den Zugriff auf Elemente über einen Index oder Indexbereich ermöglichen.
Kopier- und Aktualisierungsausdrücke instanziieren einen neuen Wert, wobei alle Elemente auf den entsprechenden Wert im ursprünglichen Ausdruck festgelegt sind, mit Ausnahme bestimmter angegebener Elemente, die auf die auf der rechten Seite des Ausdrucks definierten elemente festgelegt sind.
Sie werden mit einem ternären Operator w/
<-
erstellt; die Syntax w/
sollte als die häufig verwendete kurze Schreibweise für "with" gelesen werden:
original w/ itemAccess <- modification
original
ist dabei entweder ein Ausdruck vom benutzerdefinierten Typ oder ein Arrayausdruck. Informationen zu den entsprechenden Anforderungen für itemAccess
und modification
finden Sie unter Kopieren und Aktualisieren benutzerdefinierter Typen bzw. unter Kopieren und Aktualisieren von Arrays.
Im Hinblick auf die Rangfolge ist der Copy-and-Update-Operator linksassoziativ und hat die niedrigste Rangfolge, insbesondere eine niedrigere Rangfolge als der Bereichsoperator (..
) oder der ternäre bedingte Operator ( ).?
|
Die ausgewählte linke Assoziativität ermöglicht eine einfache Verkettung von Copy-and-Update-Ausdrücken:
let model = Default<SequentialModel>()
w/ Structure <- ClassifierStructure()
w/ Parameters <- parameters
w/ Bias <- bias;
Wie bei jedem Operator, der einen Ausdruck gleichen Typs erstellt wie der beteiligte Ausdruck, der sich am weitesten links befindet, ist die entsprechende Anweisung zur Auswertung und Neuzuweisung verfügbar.
Die beiden folgenden Anweisungen bewirken beispielsweise Folgendes: Die erste Anweisung deklariert eine veränderbare Variable (arr
) und bindet sie an den Standardwert eines Ganzzahlarrays. Die zweite Anweisung erstellt dann ein neues Array, wobei das erste Element (mit Index 0) auf „10“ festgelegt ist, und weist es arr
neu zu.
mutable arr = [0, size = 3]; // arr contains [0, 0, 0]
set arr w/= 0 <- 10; // arr contains [10, 0, 0]
Die zweite Anweisung ist lediglich eine Kurzform für die ausführlichere Syntax set arr = arr w/ 0 <- 10;
.
Kopieren und Aktualisieren benutzerdefinierter Typen
Wenn es sich beim Wert original
um einen benutzerdefinierten Typ handelt, gibt itemAccess
den Namen des Elements an, das vom ursprünglichen Wert abweicht. Hierbei handelt es sich nicht einfach um einen anderen Ausdruck wie original
und modification
. Die Möglichkeit, den Elementnamen ohne weitere Qualifizierung zu verwenden, ist nämlich auf diesen Kontext beschränkt. Es ist einer von zwei kontextbezogenen Ausdrücken in Q#.
Der Typ des modification
-Ausdrucks muss mit dem Typ des benannten Elements übereinstimmen, das abweicht.
Wenn complex
z. B. den Wert Complex(0., 0.)
enthält, wobei der Typ Complex
hier definiert ist, dann ist
complex w/ Re <- 1.
ein Ausdruck vom Typ Complex
, der als Complex(1., 0.)
ausgewertet wird.
Kopieren und Aktualisieren von Arrays
Für Arrays kann itemAccess
ein beliebiger Ausdruck eines geeigneten Typs sein. Die gleichen Typen, die für Arrayslicing gültig sind, sind in diesem Kontext gültig. Tatsächlich kann der itemAccess
-Ausdruck vom Typ Int
oder Range
sein. Wenn itemAccess
ein Wert vom Typ Int
ist, muss der Typ von modification
mit dem Elementtyp des Arrays übereinstimmen. Wenn itemAccess
ein Wert vom Typ Range
ist, muss der Typ von modification
mit dem Arraytyp identisch sein.
Wenn arr
z. B. ein Array [0, 1, 2, 3]
enthält, dann ist
arr w/ 0 <- 10
das Array[10, 1, 2, 3]
.arr w/ 2 <- 10
das Array[0, 1, 10, 3]
.arr w/ 0..2..3 <- [10, 12]
das Array[10, 1, 12, 3]
.
Copy-and-Update-Ausdrücke ermöglichen die effiziente Erstellung neuer Arrays basierend auf vorhandenen Arrays. Die Implementierung für Copy-and-Update-Ausdrücke vermeidet das Kopieren des gesamten Arrays, indem lediglich die erforderlichen Teile kopiert werden, um das gewünschte Verhalten zu erzielen, und führt nach Möglichkeit eine direkte Änderung durch. Arrayinitialisierungen verursachen daher aufgrund der Unveränderlichkeit keinen zusätzlichen Mehraufwand.
Der Namespace Microsoft.Quantum.Arrays
bietet eine Reihe praktischer Tools für die Arrayerstellung und -bearbeitung.
Copy-and-Update-Ausdrücke sind eine praktische Möglichkeit, neue Arrays spontan zu erstellen. Der folgende Ausdruck wird z. B. zu einem Array ausgewertet, wobei alle Elemente auf PauliI
festgelegt sind, mit Ausnahme des Elements am Index i
, das auf PauliZ
festgelegt ist:
[PauliI, size = n] w/ i <- PauliZ