Expressies kopiëren en bijwerken
Om de noodzaak van onveranderbare bindingen te verminderen, biedt Q# ondersteuning voor copy-and-update-expressies voor matrices, waarmee u toegang hebt tot items via een index of bereik van indexen.
Met expressies voor kopiëren en bijwerken wordt een nieuwe matrix geïnstitueerd met alle items die zijn ingesteld op de bijbehorende waarde in de oorspronkelijke matrix, met uitzondering van de bepaalde opgegeven items, die zijn ingesteld op de items die aan de rechterkant van de expressie zijn gedefinieerd.
Ze worden samengesteld met behulp van een ternaire operator w/
<-
; de syntaxis w/
moet worden gelezen als de veelgebruikte korte notatie voor "with":
original w/ itemAccess <- modification
waarbij original
een matrixexpressie is, is itemAccess
een expressie die geldig is voor matrixlicing en modification
de nieuwe waarde of waarden is. Concreet kan de itemAccess
expressie van het type Int
of Range
zijn. Als itemAccess
een waarde van het type Int
is, moet het type modification
overeenkomen met het itemtype van de matrix. Als itemAccess
een waarde van het type Range
is, moet het type modification
hetzelfde zijn als het matrixtype.
Als arr
bijvoorbeeld een matrix [0, 1, 2, 3]
bevat, dan
-
arr w/ 0 <- 10
is de matrix[10, 1, 2, 3]
. -
arr w/ 2 <- 10
is de matrix[0, 1, 10, 3]
. -
arr w/ 0..2..3 <- [10, 12]
is de matrix[10, 1, 12, 3]
.
Wat betreft prioriteit is de operator copy-and-update links-associatief en heeft de laagste prioriteit, en met name een lagere prioriteit dan de operator voor het bereik (..
) of de ternaire voorwaardelijke operator (?
|
).
Met de gekozen linkse associativiteit kunt u eenvoudig copy-and-update-expressies koppelen:
let model = ArrayConstructor()
w/ 1 <- alpha
w/ 3 <- gamma
w/ 5 <- epsilon;
Net als bij elke operator waarmee een expressie van hetzelfde type wordt samengesteld als de meest linkse expressie, is de bijbehorende instructie evalueren en opnieuw toewijzen beschikbaar.
Met de twee volgende instructies kunt u bijvoorbeeld het volgende bereiken: Met de eerste instructie wordt een veranderlijke variabele arr
gede declareert en wordt deze gekoppeld aan de standaardwaarde van een matrix met gehele getallen. Met de tweede instructie wordt vervolgens een nieuwe matrix gebouwd met het eerste item (met index 0) ingesteld op 10 en wordt deze opnieuw toegewezen aan arr
.
mutable arr = [0, size = 3]; // arr contains [0, 0, 0]
arr w/= 0 <- 10; // arr contains [10, 0, 0]
De tweede instructie is slechts kort voor de uitgebreidere syntaxis arr = arr w/ 0 <- 10;
.
Met expressies voor kopiëren en bijwerken kunt u nieuwe matrices efficiënt maken op basis van bestaande matrices. De implementatie voor expressies voor kopiëren en bijwerken voorkomt dat de hele matrix wordt gekopieerd door alleen de benodigde onderdelen te dupliceren om het gewenste gedrag te bereiken en indien mogelijk een in-place wijziging uit te voeren. Daarom hebben matrix initialisaties geen extra overhead als gevolg van onveranderbaarheid.
De Std.Arrays
naamruimte biedt een arsenaal handige hulpmiddelen voor het maken en bewerken van matrices.
Expressies voor kopiëren en bijwerken zijn een handige manier om snel nieuwe matrices te maken; met de volgende expressie wordt bijvoorbeeld een matrix geëvalueerd met alle items die zijn ingesteld op PauliI
, met uitzondering van het item op index i
, dat is ingesteld op PauliZ
:
[PauliI, size = n] w/ i <- PauliZ