Espressioni di copia e aggiornamento

Per ridurre la necessità di associazioni modificabili, Q# supporta le espressioni di copia e aggiornamento per i tipi valore con accesso agli elementi. I tipi e le matrici definiti dall'utente non sono modificabili e rientrano in questa categoria. I tipi definiti dall'utente consentono di accedere agli elementi tramite nome, mentre le matrici consentono di accedere agli elementi tramite un indice o un intervallo di indici.

Le espressioni di copia e aggiornamento creano un'istanza di un nuovo valore con tutti gli elementi impostati sul valore corrispondente nell'espressione originale, ad eccezione di determinati elementi specificati, impostati su quelli definiti sul lato destro dell'espressione. Vengono costruiti usando un operatore ternario w/<-. La sintassi w/ deve essere letta come notazione breve usata comunemente per "con":

    original w/ itemAccess <- modification

dove original è un'espressione di tipo definito dall'utente o un'espressione di matrice. Per i requisiti corrispondenti per itemAccess e modification, vedere Copia e aggiornamento di tipi definiti dall'utente e copia e aggiornamento di matrici.

In termini di precedenza, l'operatore copy-and-update è associativo a sinistra e ha la precedenza più bassa e, in particolare, la precedenza inferiore rispetto all'operatore di intervallo (..) o all'operatore condizionale ternario (?|). L'associazione sinistra scelta consente un facile concatenamento di espressioni di copia e aggiornamento:

    let model = Default<SequentialModel>()
        w/ Structure <- ClassifierStructure()
        w/ Parameters <- parameters
        w/ Bias <- bias;

Come per qualsiasi operatore che costruisce un'espressione dello stesso tipo dell'espressione più a sinistra interessata, è disponibile l'istruzione evaluate-and-reassign corrispondente. Le due istruzioni seguenti, ad esempio, ottengono quanto segue: la prima istruzione dichiara una variabile arr modificabile e la associa al valore predefinito di una matrice integer. La seconda istruzione compila quindi una nuova matrice con il primo elemento (con indice 0) impostato su 10 e lo riassegna a arr.

    mutable arr = [0, size = 3]; // arr contains [0, 0, 0]
    set arr w/= 0 <- 10;      // arr contains [10, 0, 0] 

La seconda istruzione è semplicemente breve per la sintassi set arr = arr w/ 0 <- 10;più dettagliata.

Copia e aggiornamento di tipi definiti dall'utente

Se il valore original è un tipo definito dall'utente, itemAccess indica il nome dell'elemento che differisce dal valore originale. Questa non è solo un'altra espressione, ad esempio original e modification, perché la possibilità di usare il nome dell'elemento senza ulteriori qualificazioni è limitata a questo contesto. Si tratta di una delle due espressioni contestuali in Q#.

Il tipo dell'espressione modification deve corrispondere al tipo dell'elemento denominato che diverge. Ad esempio, se complex contiene il valore Complex(0., 0.), in cui il tipo Complex è definito qui, allora

complex w/ Re <- 1. 

è un'espressione di tipo Complex che restituisce Complex(1., 0.).

Copia e aggiornamento di matrici

Per le matrici, itemAccess può essere un'espressione arbitraria di un tipo appropriato. In questo contesto, sono validi gli stessi tipi validi per il sezionamento delle matrici. In concreto, l'espressione itemAccess può essere di tipo Int o Range. Se itemAccess è un valore di tipo Int, il tipo di modification deve corrispondere al tipo di elemento della matrice. Se itemAccess è un valore di tipo Range, il tipo di modification deve essere uguale al tipo di matrice.

Ad esempio, se arr contiene una matrice [0, 1, 2, 3], allora

  • arr w/ 0 <- 10 è la matrice [10, 1, 2, 3].
  • arr w/ 2 <- 10 è la matrice [0, 1, 10, 3].
  • arr w/ 0..2..3 <- [10, 12] è la matrice [10, 1, 12, 3].

Le espressioni di copia e aggiornamento consentono la creazione efficiente di nuove matrici basate su quelle esistenti. L'implementazione per le espressioni di copia e aggiornamento evita di copiare l'intera matrice duplicando solo le parti necessarie per ottenere il comportamento desiderato ed esegue una modifica sul posto, se possibile. Di conseguenza, le inizializzazioni di matrici non comportano un sovraccarico aggiuntivo a causa dell'immutabilità.

Lo Microsoft.Quantum.Arrays spazio dei nomi fornisce un arsenale di strumenti pratici per la creazione e la manipolazione di matrici.

Le espressioni di copia e aggiornamento rappresentano un modo pratico per costruire nuove matrici in tempo reale; l'espressione seguente, ad esempio, restituisce una matrice con tutti gli elementi impostati su PauliI, ad eccezione dell'elemento in corrispondenza dell'indice i, che è impostato su PauliZ:

[PauliI, size = n] w/ i <- PauliZ