Delen via


Functor-toepassing

Functors zijn factory's waarmee u toegang krijgt tot bepaalde specialisatie-implementaties van een aanroepbaar. Q# ondersteunt momenteel twee functors; de Adjoint en de Controlled, die beide kunnen worden toegepast op bewerkingen die de nodige specialisaties bieden.

De Controlled functors en Adjoint pendelen; als ApplyUnitary een bewerking is die beide functors ondersteunt, is er geen verschil tussen Controlled Adjoint ApplyUnitary en Adjoint Controlled ApplyUnitary. Beide hebben hetzelfde type en voeren bij aanroepen de implementatie uit die is gedefinieerd voor de controlled adjointspecialisatie.

Aangrenzende functor

Als de bewerking ApplyUnitary een eenheidstransformatie-U van de kwantumstatus definieert, Adjoint ApplyUnitary wordt toegang tot de implementatie van U†. De Adjoint functor is een eigen inverse, aangezien (U†)† = U per definitie. is bijvoorbeeld Adjoint Adjoint ApplyUnitary hetzelfde als ApplyUnitary.

De expressie Adjoint ApplyUnitary is een bewerking van hetzelfde type als ApplyUnitary; deze heeft hetzelfde argument en hetzelfde retourtype en ondersteunt dezelfde functors. Net als elke bewerking kan deze worden aangeroepen met een argument van het juiste type. Met de volgende expressie wordt de aangrenzende specialisatie van ApplyUnitary toegepast op een argument arg:

Adjoint ApplyUnitary(arg) 

Gecontroleerde functor

Voor een bewerking ApplyUnitary die een eenheidstransformatie-U van de kwantumstatus definieert, Controlled ApplyUnitary krijgt u toegang tot de implementatie die U toepast, afhankelijk van alle qubits in een matrix met controle-qubits in de status |1⟩.

De expressie Controlled ApplyUnitary is een bewerking met hetzelfde retourtype en dezelfde bewerkingskenmerken als ApplyUnitary, wat betekent dat deze dezelfde functors ondersteunt. Hierbij wordt een argument van het type (Qubit[], <TIn>)gebruikt, waarbij <TIn> moet worden vervangen door het argumenttype van ApplyUnitary, rekening houdend met de equivalentie van singleton tuple .

Bewerking Argumenttype Gecontroleerd argumenttype
X Qubit (Qubit[], Qubit)
SWAP (Qubit, Qubit) (Qubit[], (Qubit, Qubit))

cs Als dit een matrix van qubits q1 bevat en q2 twee qubits zijn en de bewerking SWAPhier is gedefinieerd, wisselt de volgende expressie de status van q1 en q2 uit als alle qubits in cs de status |1⟩ hebben:

Controlled SWAP(cs, (q1, q2))

Notitie

Voorwaardelijk een bewerking toepassen op basis van de controle-qubits die zich in een andere toestand dan de toestand |1⟩ bevinden, kan worden bereikt door de juiste aangrenzende transformatie toe te passen op de controle-qubits vóór de aanroep en de inverses daarna toe te passen. Het conditioneren van de transformatie op alle controle-qubits die zich in de toestand |0⟩ bevinden, kan bijvoorbeeld worden bereikt door de X bewerking voor en na toe te passen. Dit kan gemakkelijk worden uitgedrukt met behulp van een vervoeging. Niettemin kan de uitgebreidheid van een dergelijke constructie in de toekomst extra steun verdienen voor een compactere syntaxis.