Expresiones de llamada
Las expresiones de llamada son una parte importante de cualquier lenguaje de programación. Las llamadas a funciones y operaciones, al igual que las aplicaciones parciales, se pueden usar como una expresión en cualquier lugar siempre que el valor devuelto sea de un tipo adecuado.
La utilidad de llamar a operaciones en este formato reside principalmente en la depuración, y estas llamadas de operación son una de las construcciones más comunes de cualquier Q# programa. Al mismo tiempo, solo se puede llamar a las operaciones desde otras operaciones y no desde dentro de las funciones. Para más información, consulte también Cúbits.
Con los invocables siendo valores de primera clase, las expresiones de llamada son una forma genérica de admitir patrones que no son lo suficientemente comunes como para merecer su propia construcción de lenguaje dedicado o la sintaxis dedicada no se ha introducido (todavía) por otras razones. Algunos ejemplos de métodos de biblioteca que sirven para ese propósito son ApplyIf
, que invoca una operación condicional en un bit clásico que se establece, ApplyToEach
, que aplica una operación determinada a cada elemento de una matriz y ApplyWithInputTransformation
, como se muestra en el ejemplo siguiente.
operation ApplyWithInputTransformation<'TArg, 'TIn>(
fn : 'TIn -> 'TArg,
op : 'TArg => Unit,
input : 'TIn
) : Unit {
op(fn(input));
}
ApplyWithInputTransformation
toma una función fn
, una operación op
y un valor input
como argumentos y, a continuación, aplica la función dada a la entrada antes de invocar la operación dada con el valor devuelto por la función.
Para que el compilador pueda generar automáticamente las especializaciones para admitir determinados functores, normalmente es necesario que las operaciones a las que se llama también admitan esos functores. Las dos excepciones son las llamadas en bloques externos de conjugaciones, que siempre tiene que admitir el functor Adjoint
, pero que nunca necesitan admitir el functor Controlled
, y las operaciones de unión automática, que admiten el functor Adjoint
sin imponer ningún requisito adicional en las llamadas individuales.