Literais
Literal de unidades
O único literal existente para o Unit
tipo é o valor ()
.
O Unit
valor é normalmente utilizado como um argumento para chamadas, quer porque nenhum outro argumento tem de ser transmitido ou para atrasar a execução. Também é utilizado como valor devolvido quando não é necessário devolver outro valor, o que é o caso das operações unitárias, ou seja, operações que suportam o Adjoint
e/ou o Controlled
functor.
Literais int
Os literais de valor do Int
tipo podem ser expressos em representação binária, octal, decimal ou hexadecimal. Os literais expressos em binários têm o prefixo 0b
, com 0o
para octal e com 0x
para hexadecimal. Não existe um prefixo para a representação decimal utilizada frequentemente.
Representação | Literal de Valor |
---|---|
Binário | 0b101010 |
Octal | 0o52 |
Decimal | 42 |
Hexadecimal | 0x2a |
Literais BigInt
Os literais de valor do BigInt
tipo são sempre postfixados com L
e podem ser expressos em representação binária, octal, decimal ou hexadecimal. Os literais expressos em binários têm o prefixo 0b
, com 0o
para octal e com 0x
para hexadecimal. Não existe um prefixo para a representação decimal utilizada frequentemente.
Representação | Literal de Valor |
---|---|
Binário | 0b101010L |
Octal | 0o52L |
Decimal | 42L |
Hexadecimal | 0x2aL |
Literais duplos
Os literais de valor do Double
tipo 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 nada se seguir após a vírgula decimal, o dígito após a vírgula decimal poderá ser omitido. Por exemplo, 1.
é um literal válido Double
e o mesmo que 1.0
.
Literais bool
Os literais existentes para o Bool
tipo são true
e false
.
Literais de cadeias
Um literal de valor para o String
tipo é uma sequência de comprimento arbitrário de carateres Unicode entre aspas duplas.
Dentro de uma cadeia, o caráter \
de barra invertida pode ser utilizado para escapar a um caráter de aspas duplas e para inserir uma nova linha como \n
, um símbolo de retorno como \r
e um separador como \t
.
Seguem-se exemplos de literais de cadeia válidos:
"This is a simple string."
"\"This is a more complex string.\", she said.\n"
Q# também suporta cadeias interpoladas.
Uma cadeia interpolada é um literal de cadeia que pode conter qualquer número de expressões de interpolação. Estas expressões podem ser de tipos arbitrários.
Após a construção, as expressões são avaliadas e a respetiva String
representação é inserida na localização correspondente no literal definido. A interpolação é ativada ao preceder o caráter $
especial diretamente antes da cotação inicial, sem espaço em branco entre as mesmas.
Por exemplo, se res
for uma expressão que é avaliada como 1
, a segunda frase no literal seguinte String
apresenta "O resultado foi 1":
$"This is an interpolated string. The result was {res}."
Literais de qubit
Não existem literais para o Qubit
tipo , uma vez que a memória quântica é gerida pelo runtime. Os valores do tipo Qubit
só podem ser obtidos através da alocação.
Os valores do tipo Qubit
representam um identificador opaco através do qual um bit quântico, ou qubit, pode ser resolvido. O único operador que suportam é a comparação de igualdade. Para obter mais informações sobre o Qubit
tipo de dados, veja Qubits.
Literais de resultados
Os literais existentes para o Result
tipo são Zero
e One
.
Os valores do tipo Result
representam o resultado de uma medição quântica binária.
Zero
indica uma projeção para o eigenspace +1, One
indica uma projeção para o eigenspace -1.
Literais pauli
Os literais existentes para o Pauli
tipo são PauliI
, PauliX
, PauliY
e PauliZ
.
Os valores do tipo Pauli
representam uma das quatro matrizes Pauli de qubit único, representando PauliI
a identidade.
Os valores do tipo Pauli
são normalmente utilizados para denotar o eixo para rotações e especificar em relação a que base medir.
Literais de intervalo
Os literais de valor para o Range
tipo são expressões do formulário start..step..stop
, em que start
, step
e end
são expressões do tipo Int
. Se o tamanho do passo for um, poderá ser omitido. Por exemplo, start..stop
é um literal válido Range
e o mesmo que start..1..stop
.
Os valores do tipo Range
representam uma sequência de números inteiros, em que o primeiro elemento na sequência é start
e os elementos subsequentes são obtidos ao adicionar step
ao anterior, até stop
serem transmitidos.
Range
os valores são inclusivos em ambas as extremidades, ou seja, o último elemento do intervalo é 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
.
Seguem-se exemplos de literais válidos Range
:
-
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 parênteses [
retos e ]
; por exemplo, [1,2,3]
.
Todas as expressões têm de ter um tipo base comum, que é o tipo de item da matriz. Se for especificada uma matriz vazia com []
, poderá ser necessária uma anotação de tipo para o compilador determinar o tipo adequado da expressão.
Podem ser criadas matrizes de comprimento arbitrário com uma expressão de matriz de tamanho.
Tal expressão é do formato [expr, size = s]
, onde s
pode ser qualquer expressão do tipo Int
e expr
é avaliada para um valor que será os itens da matriz repetidas s
vezes. Por exemplo, [1.2, size = 3]
cria a mesma matriz que [1.2, 1.2, 1.2]
.
Literais de cadeias de identificação
Um literal de cadeia de identificação é uma sequência de uma ou mais expressões de qualquer tipo, separadas por vírgulas e entre parênteses (
e )
. O tipo de cadeia de identificação inclui as informações sobre cada tipo de item.
Literal de Valor | Tipo |
---|---|
("Id", 0, 1.) |
(String, Int, Double) |
(PauliX,(3,1)) |
(Pauli, (Int, Int)) |
As cadeias de identificação que contêm um único item são tratadas como idênticas ao item propriamente dito, tanto no tipo como no valor, que é denominada equivalência de cadeia de identificação singleton.
As cadeias de identificação são utilizadas para agrupar valores num único valor, facilitando a sua passagem. Isto possibilita que todos os números de chamadas utilizem exatamente uma entrada e devolvam exatamente um resultado.
Literais para tipos definidos pelo utilizador
Os valores de um tipo definido pelo utilizador são construídos invocando o respetivo construtor. Um construtor predefinido é gerado automaticamente ao declarar o tipo. Atualmente, não é possível definir construtores personalizados.
Por exemplo, se IntPair
tiver dois itens do tipo Int
, IntPair(2, 3)
cria uma nova instância ao invocar o construtor predefinido.
Literais de operações e funções
As operações e funções anónimas podem ser criadas com uma expressão lambda.