Sistema de tipo

Mantendo o foco do algoritmo quântico para o que deve ser alcançado, em vez de uma representação do problema em termos de estruturas de dados, a adoção de uma perspectiva mais funcional no design da linguagem é uma escolha natural. Ao mesmo tempo, o sistema de tipos é um mecanismo eficiente que pode ser utilizado para análise de programas e outras verificações de tempo de compilação que facilitam a formulação de código robusto.

De um modo geral, o sistema de tipos Q# é bastante minimalista, no sentido de que não há uma noção explícita de classes ou interfaces, pois uma delas pode ser usada em linguagens clássicas como C# ou Java. Também adotamos uma abordagem um pouco pragmática, fazendo o progresso incremental, de modo que alguns constructos ainda não estejam totalmente integrados ao sistema de tipos. Por exemplo, os functors que podem ser usados em expressões, mas ainda não têm uma representação no sistema de tipos. Desta forma, eles não podem ser atribuídos ou passados como argumentos, assim como é o caso de callables parametrizados por tipo. Esperamos fazer um progresso incremental, estendendo o sistema de tipos para ser mais completo, e balancear as necessidades imediatas com planos de longo prazo.

Tipos disponíveis

Todos os tipos no Q# são imutáveis.

Type Descrição
Unit Representa um tipo de singleton cujo único valor é ().
Int Representa um inteiro com sinal de 64 bits. Valores variam de -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807.
BigInt Representa valores inteiros com sinal de qualquer tamanho.
Double Representa um número de ponto flutuante de 64 bits de precisão dupla. Valores variam de -1.79769313486232e308 a 1.79769313486232e308, bem como NaN (não é um número).
Bool Representa valores boolianos. Os possíveis valores são true ou false.
String Representa o texto como valores que consistem em uma sequência de unidades de código UTF-16.
Qubit Representa um identificador opaco pelo qual a memória quântica virtual pode ser resolvida. Valores do tipo Qubit são instanciados por meio de alocação.
Result Representa o resultado de uma medida projetada no eigenspaces de um operador quântico com eigenvalues ± 1. Os valores possíveis são Zero ou One.
Pauli Representa uma matriz de Pauli de qubit único. Os valores possíveis são PauliI, PauliX, PauliY ou PauliZ.
Range Representa uma sequência ordenada de valores Int espaçados igualmente. Valores podem representar sequências em ordem crescente ou decrescente.
Array Representa valores que contêm uma sequência de valores do mesmo tipo.
Tupla Representa valores que contêm um número fixo de itens de tipos diferentes. Tuplas com um único elemento são equivalentes ao elemento que contêm.
Tipo definido pelo usuário Representa um tipo definido pelo usuário que consiste em itens nomeados e anônimos de tipos diferentes. Valores são instanciados invocando o construto.
Operação Representa um callable não determinístico que usa um argumento de entrada (possivelmente com valor de tupla) e retorna uma saída (possivelmente com valor de tupla). As chamadas para valores de operação podem ter efeitos colaterais e a saída pode variar para cada chamada, mesmo quando invocada com o mesmo argumento.
Função Representa um callable determinístico que usa um argumento de entrada (possivelmente com valor de tupla) e retorna uma saída (possivelmente com valor de tupla). As chamadas para valores de função não têm efeitos colaterais e a saída será sempre a mesma dada a mesma entrada.