Freigeben über


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.

Copy-and-Update-Ausdrü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 häufig verwendete kurze Notation 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 sowie 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 Complexhier 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