Aplikace funktoru

Functory jsou továrny, které umožňují přístup ke konkrétním implementaci specializace volatelné. Q# aktuálně podporuje dva funktory; Adjoint a Controlled, z nichž oba mohou být použity na operace, které poskytují nezbytné specializace.

Controlled a Adjoint ztlumení; pokud ApplyUnitary je operace, která podporuje oba funktory, neexistuje žádný rozdíl mezi Controlled Adjoint ApplyUnitary a Adjoint Controlled ApplyUnitary. Oba mají stejný typ a po vyvolání spusťte implementaci definovanou pro controlled adjointspecializace.

Adjoint functor

Pokud operace ApplyUnitary definuje jednotkovou transformaci U kvantového stavu, Adjoint ApplyUnitary přistupuje k implementaci U†. Adjoint functor je vlastní inverzní, protože (U†)† = U podle definice. Například Adjoint Adjoint ApplyUnitary je stejná jako ApplyUnitary.

Výraz Adjoint ApplyUnitary je operace stejného typu jako ApplyUnitary; má stejný argument a návratový typ a podporuje stejné funktory. Stejně jako jakoukoli operaci lze vyvolat pomocí argumentu vhodného typu. Následující výraz použije adjoint specializaciApplyUnitary na argument arg:

Adjoint ApplyUnitary(arg) 

Řízený functor

Pro operaci ApplyUnitary, která definuje jednotkovou transformaci U kvantového stavu, Controlled ApplyUnitary přistupuje k implementaci, která použije U podmíněný na všech qubitech v poli řídicích qubitů, které jsou ve stavu |1⟩.

Výraz Controlled ApplyUnitary je operace se stejným návratovým typem a charakteristiky operace jako ApplyUnitary, což znamená, že podporuje stejné funktory. Bere v úvahu argument typu (Qubit[], <TIn>), kde <TIn> by měl být nahrazen typem argumentu ApplyUnitary, přičemž ekvivalence řazené kolekce členů s jednímtonem.

Operace Typ argumentu Typ řízeného argumentu
X Qubit (Qubit[], Qubit)
VYMĚNIT (Qubit, Qubit) (Qubit[], (Qubit, Qubit))

Konkrétně platí, že pokud cs obsahuje pole qubitů, q1 a q2 jsou dva qubity a operace SWAP je definovaná tady, pak následující výraz vymění stav q1 a q2, pokud jsou všechny qubity v cs ve stavu |1⟩:

Controlled SWAP(cs, (q1, q2))

Poznámka:

Podmíněné použití operace na základě řídicích qubitů, které jsou ve stavu jiném než |1⟩, lze dosáhnout použitím odpovídající adjointable transformace na řídicí qubity před vyvoláním a použitím inverzních inverzních funkcí po. Transformaci všech řídicích qubitů, které jsou ve stavu |0⟩, lze například dosáhnout použitím operace X před a po. To lze pohodlně vyjádřit pomocí konjugace. Podrobnosti takového konstruktoru však mohou v budoucnu zasáhnou další podporu kompaktnější syntaxe.