Compartir a través de


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