Udostępnij za pośrednictwem


Wyrażenia kopiowania i aktualizowania

Aby zmniejszyć potrzebę powiązania modyfikowalnego, Q# obsługuje wyrażenia kopiowania i aktualizacji dla typów wartości z dostępem do elementów. Typy i tablice zdefiniowane przez użytkownika są niezmienne i należą do tej kategorii. Typy zdefiniowane przez użytkownika umożliwiają dostęp do elementów za pośrednictwem nazwy, natomiast tablice umożliwiają dostęp do elementów za pośrednictwem indeksu lub zakresu indeksów.

Wyrażenia copy-and-update tworzy wystąpienie nowej wartości ze wszystkimi elementami ustawionymi na odpowiednią wartość w oryginalnym wyrażeniu, z wyjątkiem określonych elementów, które są ustawione na te zdefiniowane po prawej stronie wyrażenia. Są one konstruowane przy użyciu operatoraternary w/ <-; składnia w/ powinna być odczytywana jako powszechnie używana krótka notacja "with":

    original w/ itemAccess <- modification

gdzie original jest wyrażeniem typu zdefiniowanego przez użytkownika lub wyrażeniem tablicy. Aby uzyskać odpowiednie wymagania dotyczące itemAccess elementów i modification, zobacz Kopiowanie i aktualizowanie typów zdefiniowanych przez użytkownika oraz Kopiowanie i aktualizowanie tablic.

Jeśli chodzi o pierwszeństwo, operator kopiowania i aktualizacji jest skojarzony z lewej i ma najniższy priorytet, a w szczególności niższy priorytet niż operator zakresu (..) lubternary operator warunkowy (? |). Wybrana łączność po lewej stronie umożliwia łatwe tworzenie łańcuchów wyrażeń kopiowania i aktualizacji:

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

Jeśli chodzi o każdy operator, który tworzy wyrażenie tego samego typu co wyrażenie najbardziej lewe, jest dostępna odpowiednia instrukcja evaluate-and-reassign. Na przykład dwie następujące instrukcje umożliwiają osiągnięcie następujących wartości: Pierwsza instrukcja deklaruje zmienną arr modyfikowalny i wiąże ją z wartością domyślną tablicy całkowitej. Druga instrukcja następnie tworzy nową tablicę z pierwszym elementem (z indeksem 0) ustawionym na 10 i ponownie przypisuje ją do arr.

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

Druga instrukcja jest po prostu krótka dla bardziej pełnej składni set arr = arr w/ 0 <- 10;.

Kopiowanie i aktualizowanie typów zdefiniowanych przez użytkownika

Jeśli wartość original jest typem zdefiniowanym przez użytkownika, itemAccess oznacza nazwę elementu, który różni się od oryginalnej wartości. Nie jest to tylko inne wyrażenie, takie jak original i modification, ponieważ możliwość używania nazwy elementu bez dalszej kwalifikacji jest ograniczona do tego kontekstu; jest to jedno z dwóch wyrażeń kontekstowych w elemencie Q#.

Typ modification wyrażenia musi być zgodny z typem nazwanego elementu, który się różni. Jeśli na przykład complex zawiera wartość Complex(0., 0.), gdzie typ Complex jest zdefiniowany w tym miejscu, wówczas

complex w/ Re <- 1. 

jest wyrażeniem typu Complex , które daje wartość Complex(1., 0.).

Kopiowanie i aktualizowanie tablic

W przypadku tablic itemAccess może być dowolne wyrażenie odpowiedniego typu. W tym kontekście prawidłowe są te same typy, które są prawidłowe dla fragmentowania tablicy. W konkretnym przypadku itemAccess wyrażenie może mieć typ Int lub Range. Jeśli itemAccess jest wartością typu Int, typ modification musi być zgodny z typem elementu tablicy. Jeśli itemAccess jest wartością typu Range, typ modification musi być taki sam jak typ tablicy.

Jeśli na przykład arr zawiera tablicę [0, 1, 2, 3], to

  • arr w/ 0 <- 10 to tablica [10, 1, 2, 3].
  • arr w/ 2 <- 10 to tablica [0, 1, 10, 3].
  • arr w/ 0..2..3 <- [10, 12] to tablica [10, 1, 12, 3].

Wyrażenia kopiowania i aktualizacji umożliwiają wydajne tworzenie nowych tablic na podstawie istniejących. Implementacja wyrażeń kopiowania i aktualizacji pozwala uniknąć kopiowania całej tablicy przez duplikowanie tylko niezbędnych części do osiągnięcia żądanego zachowania i w miarę możliwości wykonuje modyfikację w miejscu. W związku z tym inicjowanie tablicy nie wiąże się z dodatkowym obciążeniem ze względu na niezmienność.

Microsoft.Quantum.Arrays Przestrzeń nazw udostępnia arsenał wygodnych narzędzi do tworzenia tablicy i manipulowania nimi.

Wyrażenia kopiowania i aktualizacji to wygodny sposób konstruowania nowych tablic na bieżąco; następujące wyrażenie, na przykład, daje w wyniku tablicę ze wszystkimi elementami ustawionymi na PauliIwartość , z wyjątkiem elementu w indeksie i, który jest ustawiony na PauliZwartość :

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