Literais
Literal Unit
O único literal existente para o tipo Unit
é o valor ()
.
O valor Unit
normalmente é usado como um argumento para chamáveis, por exemplo, porque nenhum outro argumento precisa ser passado ou para atrasar a execução. Ele também é usado como valor retornado quando nenhum outro valor precisa ser retornado, que é o caso das operações unitárias, ou seja, operações compatíveis com o functor Adjoint
e/ou Controlled
.
Literais int
Os literais de valor para o tipo Int
podem ser expressos em representação binária, octal, decimal ou hexadecimal. Literais expressos em binário são prefixados com 0b
, com 0o
para octal e com 0x
para hexadecimal. Não há nenhum prefixo para a representação decimal comumente usada.
Representação | Literal de valor |
---|---|
Binário | 0b101010 |
Octal | 0o52 |
Decimal | 42 |
Hexadecimal | 0x2a |
Literais bigint
Os literais de valor para o tipo BigInt
são sempre pós-fixados com L
e podem ser expressos em representação binária, octal, decimal ou hexadecimal. Literais expressos em binário são prefixados com 0b
, com 0o
para octal e com 0x
para hexadecimal. Não há nenhum prefixo para a representação decimal comumente usada.
Representação | Literal de valor |
---|---|
Binário | 0b101010L |
Octal | 0o52L |
Decimal | 42L |
Hexadecimal | 0x2aL |
Literais Double
Literais de valor para o tipo Double
podem ser expressos em notação padrão ou científica.
Representação | Literal de valor |
---|---|
Standard | 0.1973269804 |
Científico | 1.973269804e-1 |
Se não houver nada após o ponto decimal, o dígito após o ponto decimal poderá ser omitido. Por exemplo, 1.
é um literal Double
válido e é o mesmo que 1.0
.
Literais boolianos
Literais existentes para o tipo Bool
são true
e false
.
Literais de cadeia de caracteres
Um valor literal para o tipo String
é uma sequência de comprimento arbitrário de caracteres Unicode entre aspas duplas.
Dentro de uma string, o caractere de barra invertida \
pode ser usado para escapar de um caractere de aspas duplas e inserir uma nova linha como \n
, um retorno de carro como \r
e uma tabulação como \t
.
Veja a seguir exemplos para literais de cadeia de caracteres válidos:
"This is a simple string."
"\"This is a more complex string.\", she said.\n"
Q# também aceita cadeias de caracteres interpoladas.
Uma cadeia de caracteres interpolada é um literal de cadeia de caracteres que pode conter expressões de interpolação. Essas expressões podem ser de tipos arbitrários.
Após a construção, as expressões são avaliadas e a representação String
é inserida no local correspondente dentro do literal definido. A interpolação é habilitada ao anexar o caractere especial $
diretamente antes das aspas iniciais, ou seja, sem nenhum espaço em branco entre eles.
Por exemplo, se res
for uma expressão avaliada como 1
, a segunda frase no seguinte literal String
será "O resultado foi 1.":
$"This is an interpolated string. The result was {res}."
Literais de qubit
Não existem literais para o tipo Qubit
, pois a memória quântica é gerenciada pelo runtime. Portanto, os valores do Qubit
tipo só podem ser obtidos por meio da alocação.
Os valores do tipo Qubit
representam um identificador opaco pelo qual um bit quântico, ou qubit, pode ser chamado. O único operador que aceito é a comparação de igualdade. Para obter mais informações sobre o tipo de dados Qubit
, confira Qubits.
Literais de resultado
Literais existentes para o tipo Result
são Zero
e One
.
Os valores do tipo Result
representam o resultado de uma medida quântica binária.
Zero
indica uma projeção no eigenspace +1, One
indica uma projeção no eigenspace -1.
Literais de Pauli
Literais existentes para o tipo Pauli
são PauliI
, PauliX
, PauliY
e PauliZ
.
Os valores do tipo Pauli
representam uma das quatro matrizes De Pauli de qubit único, com a representação da identidade PauliI
.
Valores do tipo Pauli
normalmente são usados para denotar o eixo para rotações e especificar com relação a qual base medir.
Literais de intervalo
Literais de valor para o tipo Range
são expressões do formato start..step..stop
, onde start
, step
e end
são expressões do tipo Int
. Se o tamanho da etapa for um, ele poderá ser omitido. Por exemplo, start..stop
é um literal Range
válido e é o mesmo que start..1..stop
.
Os valores do tipo Range
representam uma sequência de inteiros, start
em que o primeiro elemento na sequência é e step
os elementos subsequentes são obtidos adicionando ao anterior, stop
até que seja passado.
Os valores de Range
são inclusivos nas duas extremidades. Ou seja, o último elemento do intervalo será stop
se a diferença entre start
e stop
for um múltiplo de step
.
Um intervalo pode estar vazio se, por exemplo, step
for positivo e stop < start
.
Veja a seguir exemplos para literais de cadeia de Range
válido:
-
1..3
é o intervalo 1, 2, 3. -
2..2..5
é o intervalo 2, 4. -
2..2..6
é o intervalo 2, 4, 6. -
6..-2..2
é o intervalo 6, 4. 2. -
2..-2..1
é o intervalo 2. -
2..1
é o intervalo vazio.
Para obter mais informações, veja Expressões contextuais.
Literais de matriz
Um literal de matriz é uma sequência de zero ou mais expressões, separadas por vírgulas e entre colchetes [
e ]
; por exemplo, [1,2,3]
.
Todas as expressões precisa ter um tipo base comum, que é o tipo de item da matriz. Se uma matriz vazia for especificada com []
, uma anotação de tipo poderá ser necessária para que o compilador determine o tipo apropriado da expressão.
Matrizes de comprimento arbitrário podem ser criadas usando uma expressão de matriz dimensionada.
Essa expressão é do formato [expr, size = s]
, em s
que pode ser qualquer expressão do tipo Int
e expr
é avaliada como um valor que será os itens da matriz repetidamente s
. Por exemplo, [1.2, size = 3]
cria a mesma matriz que [1.2, 1.2, 1.2]
.
Literais de tupla
Um literal de tupla é uma sequência de uma ou mais expressões de qualquer tipo, separadas por vírgula e entre parênteses, (
e )
. O tipo da tupla inclui as informações sobre cada tipo de item.
Literal de valor | Type |
---|---|
("Id", 0, 1.) |
(String, Int, Double) |
(PauliX,(3,1)) |
(Pauli, (Int, Int)) |
As tuplas que contêm um só item são tratadas como idênticas ao próprio item, tanto em relação ao tipo quanto ao valor, o que é chamado de equivalência de tupla singleton.
As tuplas são usadas para agrupar valores em um único valor, para que sejam passados com mais facilidade. Isso possibilita que cada chamável receba exatamente uma entrada e retorne exatamente uma saída.
Literais de tipos definidos pelo usuário
Os valores de um tipo definido pelo usuário são construídos invocando os respectivos construtores. Um construtor padrão é gerado automaticamente ao declarar o tipo. Atualmente, não é possível definir construtores personalizados.
Por exemplo, se IntPair
tiver dois itens do tipo Int
, então IntPair(2, 3)
criará uma nova instância invocando o construtor padrão.
Literais de operação e função
Operações e funções anônimas podem ser criadas usando uma expressão lambda.