Выражения вызова
Выражения вызовов являются важной частью любого языка программирования. Вызовы операций и функций (как и применения частично выполненной строки) можно использовать в качестве выражения в любом месте, если возвращаемое значение относится к подходящему типу.
Полезность вызова операций в этой форме в первую очередь заключается в отладке, и такие вызовы операций являются одной из наиболее распространенных конструкций в любой Q# программе. В то же время операции можно вызывать только из других операций, а не из функций. Дополнительные сведения см. в разделе Кубиты.
Так как вызываемые компоненты являются первоклассными значениями, выражения вызова являются универсальным способом поддержки шаблонов, которые не являются достаточно распространенными, чтобы заслуживают собственной конструкции языка, или выделенный синтаксис (пока) не был введен по другим причинам. Среди примеров методов библиотеки, которые используются для этой цели, — ApplyIf
. Он вызывает условие операции для задаваемого классического бита, ApplyToEach
, который применяет заданную операцию к каждому элементу в массиве, и ApplyWithInputTransformation
, как показано в следующем примере.
operation ApplyWithInputTransformation<'TArg, 'TIn>(
fn : 'TIn -> 'TArg,
op : 'TArg => Unit,
input : 'TIn
) : Unit {
op(fn(input));
}
ApplyWithInputTransformation
принимает функцию fn
, операцию op
и значение input
в качестве аргументов, применяет заданную функцию к входным данным, а затем вызывает заданную операцию со значением, возвращенным функцией.
Чтобы компилятор мог автоматически создавать специализации для поддержки определенных функторов, обычно требуется, чтобы вызванные операции поддерживали эти функторы. Исключением являются вызовы во внешних блоках сопряжений, которые всегда нуждаются в поддержке функтора Adjoint
, но не нуждаются в поддержке функтора Controlled
, и операции самостоятельного сопряжения, поддерживающие функтор Adjoint
без дополнительных требований к отдельным вызовам.