Expresiones de copia y actualización
Para reducir la necesidad de enlaces mutables, Q# admite expresiones de copia y actualización para tipos de valor con acceso a elementos. Los tipos definidos por el usuario y las matrices son inmutables y entran en esta categoría. Los tipos definidos por el usuario permiten acceder a los elementos mediante el nombre, mientras que las matrices permiten acceder a los elementos mediante un índice o un intervalo de índices.
Las expresiones copy-and-update crean una instancia de un nuevo valor con todos los elementos establecidos en el valor correspondiente de la expresión original, excepto determinados elementos especificados, que se establecen en los definidos en el lado derecho de la expresión.
Se construyen mediante un operador w/
<-
ternario; la sintaxis w/
debe leerse como notación corta usada habitualmente para "with":
original w/ itemAccess <- modification
donde original
es una expresión de tipo definido por el usuario o una expresión de matriz. Para conocer los requisitos correspondientes para itemAccess
y modification
, consulte Copia y actualización de tipos definidos por el usuario y Copia y actualización de matrices.
En términos de precedencia, el operador copy-and-update es asociativo a la izquierda y tiene prioridad más baja, y, en particular, menor prioridad que el operador de intervalo (..
) o el operador condicional ternario (?
|
).
La asociatividad a la izquierda elegida permite un encadenamiento sencillo de expresiones de copia y actualización:
let model = Default<SequentialModel>()
w/ Structure <- ClassifierStructure()
w/ Parameters <- parameters
w/ Bias <- bias;
Al igual que para cualquier operador que construye una expresión del mismo tipo que la expresión más a la izquierda implicada, está disponible la instrucción de evaluación y reasignación correspondiente.
Las dos instrucciones que se muestran a continuación, por ejemplo, logran lo siguiente: la primera instrucción declara una variable mutable arr
y la enlaza al valor predeterminado de una matriz de enteros. A continuación, la segunda instrucción crea una nueva matriz con el primer elemento (con el índice 0) establecido en 10 y la reasigna a arr
.
mutable arr = [0, size = 3]; // arr contains [0, 0, 0]
set arr w/= 0 <- 10; // arr contains [10, 0, 0]
La segunda instrucción no es más que una versión abreviada de la sintaxis set arr = arr w/ 0 <- 10;
más detallada.
Copia y actualización de tipos definidos por el usuario
Si el valor de original
es de un tipo definido por el usuario, itemAccess
denota el nombre del elemento que difiere del valor original. No se trata sencillamente de otra expresión, como original
y modification
, ya que la capacidad de usar el nombre del elemento sin ninguna calificación adicional se limita a este contexto; es una de las dos expresiones contextuales de Q#.
El tipo de la expresión modification
debe coincidir con el tipo del elemento con nombre que difiere.
Por ejemplo, si complex
contiene el valor Complex(0., 0.)
, donde el tipo Complex
se define aquí, entonces
complex w/ Re <- 1.
es una expresión de tipo Complex
que se evalúa como Complex(1., 0.)
.
Copia y actualización de matrices
En el caso de las matrices, itemAccess
puede ser una expresión arbitraria de un tipo adecuado; los mismos tipos que son válidos para la segmentación de matrices son válidos en este contexto. En concreto, la expresión itemAccess
puede ser de tipo Int
o Range
. Si itemAccess
es un valor de tipo Int
, el tipo de modification
tiene que coincidir con el tipo de elemento de la matriz. Si itemAccess
es un valor de tipo Range
, el tipo de modification
debe ser el mismo que el tipo de la matriz.
Por ejemplo, si arr
contiene una matriz [0, 1, 2, 3]
,
arr w/ 0 <- 10
es la matriz[10, 1, 2, 3]
.arr w/ 2 <- 10
es la matriz[0, 1, 10, 3]
.arr w/ 0..2..3 <- [10, 12]
es la matriz[10, 1, 12, 3]
.
Las expresiones de copia y actualización permiten la creación eficaz de nuevas matrices basadas en las existentes. La implementación de las expresiones de copia y actualización evita copiar toda la matriz mediante la duplicación solo de las partes necesarias para lograr el comportamiento deseado, y realiza una modificación local si es posible. Por lo tanto, las inicializaciones de matrices no incurren en una sobrecarga adicional debido a la inmutabilidad.
El espacio de nombres Microsoft.Quantum.Arrays
proporciona un arsenal de herramientas prácticas para la creación y manipulación de matrices.
Las expresiones de copia y actualización son una manera cómoda de construir nuevas matrices sobre la marcha. La siguiente expresión, por ejemplo, se evalúa como una matriz con todos los elementos establecidos en PauliI
, excepto el elemento del índice i
, que se establece en PauliZ
:
[PauliI, size = n] w/ i <- PauliZ