Literales
Literal Unit
El único literal que existe para el tipo Unit
es el valor ()
.
El valor Unit
se usa normalmente como argumento para los elementos invocables, ya sea porque no es necesario pasar ningún otro argumento o para retrasar la ejecución. También se usa como valor devuelto cuando no es necesario devolver ningún otro valor, que es el caso de las operaciones unitarias, es decir, las operaciones que admiten los functores Adjoint
o Controlled
.
Literales Int
Los literales de valor para el tipo Int
se pueden expresar en formato binario, octal, decimal o hexadecimal. Los literales binarios incluyen el prefijo 0b
, los octales el prefijo 0o
y los hexadecimales el prefijo 0x
. No hay ningún prefijo para el formato decimal usado con frecuencia.
Representación | Literal de valor |
---|---|
Binary | 0b101010 |
Octal | 0o52 |
Decimal | 42 |
Hexadecimal | 0x2a |
Literales BigInt
Los literales de valor para el tipo BigInt
siempre incluyen el postfijo L
y se pueden expresar en formato binario, octal, decimal o hexadecimal. Los literales binarios incluyen el prefijo 0b
, los octales el prefijo 0o
y los hexadecimales el prefijo 0x
. No hay ningún prefijo para el formato decimal usado con frecuencia.
Representación | Literal de valor |
---|---|
Binary | 0b101010L |
Octal | 0o52L |
Decimal | 42L |
Hexadecimal | 0x2aL |
Literales Double
Los literales de valor para el tipo Double
se pueden expresar en notación estándar o científica.
Representación | Literal de valor |
---|---|
Estándar | 0.1973269804 |
Científico | 1.973269804e-1 |
Si no hay nada después del separador decimal, se puede omitir el dígito después del separador. Por ejemplo, 1.
es un literal válido de tipo Double
y es el mismo que 1.0
.
Literales de tipo Bool
Los literales que existen para el tipo Bool
son true
y false
.
Literales de cadena
Un literal de valor para el tipo String
es una secuencia de longitud arbitraria de caracteres Unicode entre comillas dobles.
Dentro de una cadena, el carácter de barra invertida \
se puede usar para evitar un carácter de comilla doble, así como para agregar una nueva línea como \n
, un retorno de carro como \r
y una pestaña como \t
.
A continuación se muestran ejemplos de literales de cadena válidos:
"This is a simple string."
"\"This is a more complex string.\", she said.\n"
Q# también admite cadenas interpoladas.
Una cadena interpolada es un literal de cadena que puede contener expresiones de interpolación. Estas expresiones pueden ser de tipos arbitrarios.
Tras la construcción, se evalúan las expresiones y su representación String
se agrega en la ubicación correspondiente dentro del literal definido. La interpolación se habilita anteponiendo el carácter especial $
directamente antes de las comillas iniciales, sin ningún espacio en blanco entre ellos.
Por ejemplo, si res
es una expresión que se evalúa como 1
, la segunda frase del literal String
siguiente muestra "El resultado fue 1.":
$"This is an interpolated string. The result was {res}."
Literales de tipo Qubit
No existen literales para el tipo Qubit
, ya que el tiempo de ejecución administra la memoria cuántica. Por lo tanto, los valores de tipo Qubit
solo se pueden obtener a través de asignación.
Los valores de tipo Qubit
representan un identificador opaco por el que se puede hacer referencia a un bit cuántico, o cúbit. El único operador que admiten es la comparación de igualdad. Para más información sobre el tipo de datos Qubit
, consulte Cúbits.
Literales de tipo Result
Los literales que existen para el tipo Result
son Zero
y One
.
Los valores de tipo Result
representan el resultado de una medida cuántica binaria.
Zero
indica una proyección en el espacio propio +1, One
indica una proyección en el espacio propio -1.
Literales de tipo Pauli
Los literales que existen para el tipo Pauli
son PauliI
, PauliX
, PauliY
y PauliZ
.
Los valores de tipo Pauli
representan una de las cuatro matrices de Pauli de un solo cúbit, donde PauliI
representa la identidad.
Los valores de tipo Pauli
se usan normalmente para indicar el eje para las rotaciones y para especificar con respecto a qué base medir.
Literales de tipo Range
Los literales de valor para el tipo Range
son expresiones con el formato start..step..stop
, donde start
, step
y end
son expresiones de tipo Int
. Si el tamaño del paso es uno, se puede omitir. Por ejemplo, start..stop
es un literal válido de tipo Range
y es el mismo que start..1..stop
.
Los valores de tipo Range
representan una secuencia de enteros, donde el primer elemento de la secuencia es start
y los elementos posteriores se obtienen agregando step
al anterior, hasta que se pasa stop
.
Los valores de tipo Range
son inclusivos en ambos extremos, es decir, el último elemento del intervalo es stop
si la diferencia entre start
y stop
es un múltiplo de step
.
Un intervalo puede estar vacío si, por ejemplo, step
es positivo y stop < start
.
A continuación se muestran ejemplos de literales de Range
válidos:
-
1..3
es el intervalo 1, 2, 3. -
2..2..5
es el intervalo 2, 4. -
2..2..6
es el intervalo 2, 4, 6. -
6..-2..2
es el intervalo 6, 4, 2. -
2..-2..1
es el intervalo 2. -
2..1
es el intervalo vacío.
Para más información, consulte Expresiones contextuales.
Literales de matriz
Un literal de matriz es una secuencia de cero o más expresiones, separadas por comas y entre corchetes [
y ]
; por ejemplo, [1,2,3]
.
Todas las expresiones deben tener un tipo base común, que es el tipo de elemento de la matriz. Si se especifica una matriz vacía con []
, es posible que se necesite una anotación de tipo para que el compilador determine el tipo adecuado de la expresión.
Las matrices de longitud arbitraria se pueden crear mediante una expresión de matriz de tamaño.
Esta expresión tiene el formato [expr, size = s]
, donde s
puede ser cualquier expresión de tipo Int
y expr
se evalúa como un valor que será los elementos de la matriz repetidas s
veces. Por ejemplo, [1.2, size = 3]
crea la misma matriz que [1.2, 1.2, 1.2]
.
Literales de tupla
Un literal de tupla es una secuencia de una o varias expresiones de cualquier tipo entre paréntesis (
y )
separadas por comas. El tipo de tupla incluye información sobre cada tipo de elemento.
Literal de valor | Tipo |
---|---|
("Id", 0, 1.) |
(String, Int, Double) |
(PauliX,(3,1)) |
(Pauli, (Int, Int)) |
Las tuplas que contienen un solo elemento se tratan como idénticas al propio elemento, tanto en cuanto al tipo como al valor, lo que se conoce como equivalencia de tupla singleton.
Las tuplas se usan para agrupar valores en un solo valor, lo que facilita su paso. Esto hace posible que cada elemento invocable tome exactamente una entrada y devuelva exactamente una salida.
Literales para tipos definidos por el usuario
Los valores de un tipo definido por el usuario se construyen invocando a su constructor. Al declarar el tipo, se genera automáticamente un constructor predeterminado. Actualmente no es posible definir constructores personalizados.
Por ejemplo, si IntPair
tiene dos elementos de tipo Int
, IntPair(2, 3)
crea una nueva instancia invocando al constructor predeterminado.
Literales de operación y función
Las operaciones y funciones anónimas se pueden crear mediante una expresión lambda.