Применение функтора

Функторы — это фабрики, которые обеспечивают доступ к определенным реализациям специализаций вызываемого объекта. В Q# в настоящее время поддерживаются два функтора: Adjoint и Controlled. Оба они могут применяться к операциям, которые обеспечивают необходимые специализации.

Функторы Controlled и Adjoint являются коммутируемыми: если операция ApplyUnitary поддерживает оба функтора, разницы между Controlled Adjoint ApplyUnitary и Adjoint Controlled ApplyUnitary нет. Оба они имеют одинаковый тип и при вызове выполняют реализацию, определенную для controlled adjointспециализации.

Функтор Adjoint

Если операция ApplyUnitary определяет унитарное преобразование U квантового состояния, Adjoint ApplyUnitary обращается к реализации U†. Функтор Adjoint является самоинверсным, так как по определению (U†)† = U. Например, Adjoint Adjoint ApplyUnitary равносильно ApplyUnitary.

Выражение Adjoint ApplyUnitary является операцией того же типа, что и ApplyUnitary. Она имеет тот же аргумент и тип возвращаемого значения и поддерживает те же функторы. Как и любую операцию, ее можно вызвать с аргументом подходящего типа. Следующее выражение применяет сопряженную специализациюApplyUnitary к аргументу arg:

Adjoint ApplyUnitary(arg) 

Функтор Controlled

Для операции ApplyUnitary, определяющей унитарное преобразование U квантового состояния, Controlled ApplyUnitary обращается к реализации, которая условно применяет U ко всем кубитам в массиве управляющих кубитов в состоянии |1⟩.

Выражение Controlled ApplyUnitary — это операция с тем же типом возвращаемого значения и характеристиками операций, что и ApplyUnitary, а значит поддерживает те же функторы. Она принимает аргумент типа (Qubit[], <TIn>), где <TIn> следует заменить типом аргумента ApplyUnitary с учетом эквивалентности одноэлементного кортежа.

Операция Тип аргумента Контролируемый тип аргумента
X Qubit (Qubit[], Qubit)
SWAP (Qubit, Qubit) (Qubit[], (Qubit, Qubit))

В частности, если cs содержит массив кубитов, q1 и q2 — два кубита и операция SWAP соответствует данному определению, то следующее выражение производит обмен состояний для q1 и q2 при условии, что все кубиты в cs находятся в состоянии |1⟩:

Controlled SWAP(cs, (q1, q2))

Примечание

Условное применение операции на основе кубитов элемента управления в состоянии, отличном от состояния |1⟩ может быть достигнуто путем применения соответствующего смежного преобразования к кубитам элемента управления перед вызовом и применения обратных значений после. Например, условное преобразование всех управляющих кубитов в состоянии |0⟩ может быть реализовано путем применения операции X до и после. Это можно легко выразить с помощью сопряжения. Однако такая пространная конструкции может в будущем поддерживать более компактный синтаксис.