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 \re 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, PauliYe 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, stepe 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 é starte 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.