Expresiones de copia y actualización

Para reducir la necesidad de enlaces mutables, Q# admite expresiones de copia y actualización para matrices, lo que permite acceder a los elementos a través de un índice o intervalo de índices.

Las expresiones copy-and-update crean una instancia de una nueva matriz con todos los elementos establecidos en el valor correspondiente de la matriz original, excepto los determinados elementos especificados, que se establecen en los definidos en el lado derecho de la expresión. Se construyen utilizando un operador ternario w/<-; la sintaxis w/ debe leerse como la notación corta que se usa habitualmente para "with":

    original w/ itemAccess <- modification

donde original es una expresión de matriz, itemAccess es cualquier expresión válida para la segmentación de matriz y modification es el nuevo valor o valores. Concretamente, la expresión itemAccess puede ser de tipo Int o Range. Si itemAccess es un valor de tipo Int, el tipo de modification debe 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 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].

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 izquierda elegida permite encadenar fácilmente expresiones de copia y actualización:

    let model = ArrayConstructor()
        w/ 1 <- alpha
        w/ 3 <- gamma
        w/ 5 <- epsilon;

En cuanto a cualquier operador que construya una expresión del mismo tipo que la expresión de la izquierda implicada, está disponible la instrucción evaluate-and-reassign correspondiente instrucción evaluate-and-reassign. Las dos instrucciones siguientes, 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 compila una nueva matriz con el primer elemento (con el índice 0) establecido en 10 y lo reasigna a arr.

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

La segunda instrucción es simplemente breve para la sintaxis más detallada arr = arr w/ 0 <- 10;.

Las expresiones de copia y actualización permiten la creación eficaz de nuevas matrices basadas en las existentes. La implementación de expresiones de copia y actualización evita copiar toda la matriz duplicando solo las partes necesarias para lograr el comportamiento deseado y realiza una modificación local si es posible. Por lo tanto, las inicializaciones de matriz no incurren en sobrecarga adicional debido a la inmutabilidad.

El espacio de nombres Std.Arrays proporciona un arsenal de herramientas cómodas 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 en el índice i, que se establece en PauliZ:

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