Sistema di tipi

Quando si tratta di algoritmi quantistici, l'attenzione è orientata verso l'obiettivo da raggiungere più che su una rappresentazione del problema in termini di strutture dei dati. È quindi naturale scegliere di adottare un punto di vista più funzionale sulla progettazione del linguaggio. Allo stesso tempo, il sistema dei tipi è un meccanismo potente che può essere sfruttato per l'analisi del programma e altri controlli in fase di compilazione, che facilitano la formulazione di codice affidabile.

In generale, il sistema dei tipi di Q# è piuttosto minimale, nel senso che non esiste una nozione esplicita di classi o interfacce come quella a cui si potrebbe essere abituati come utenti di linguaggi classici come C# o Java. Esiste anche un approccio per così dire pragmatico che fa registrare progressi incrementali, così che certi costrutti non sono ancora completamente integrati nel sistema dei tipi. Un esempio sono i funtori, che possono essere usati nelle espressioni, ma non hanno ancora una rappresentazione nel sistema dei tipi. Di conseguenza, attualmente non possono essere assegnati o passati come argomenti, come nel caso degli elementi chiamabili parametrizzati dai tipi. Sono previsti progressi incrementali nell'estensione del sistema dei tipi per renderlo più completo, con l'obiettivo di bilanciare le necessità immediate con i piani a lungo termine.

Tipi disponibili

Tutti i tipi in Q# sono non modificabili.

Tipo Descrizione
Unit Rappresenta un tipo singleton il cui unico valore è ().
Int Rappresenta un intero con segno a 64 bit. I valori validi sono compresi tra -9,223,372,036,854,775,808 e 9,223,372,036,854,775,807.
BigInt Rappresenta i valori interi con segno di qualsiasi dimensione.
Double Rappresenta un numero a virgola mobile a 64 bit e precisione doppia. I valori validi sono compresi tra -1.79769313486232e308 e 1.79769313486232e308, nonché non un numero.
Bool Rappresenta valori booleani. I possibili valori sono true o false.
String Rappresenta il testo come valori costituiti da una sequenza di unità di codice UTF-16.
Qubit Rappresenta un identificatore opaco da cui la memoria quantistica virtuale può essere gestita. Tramite allocazione viene creata un'istanza dei valori di tipo Qubit.
Result Rappresenta il risultato di una misurazione proiettiva sugli autospazi di un operatore quantistico con autovalori ±1. I possibili valori sono Zero o One.
Pauli Rappresenta una matrice di Pauli a qubit singolo. I possibili valori sono PauliI, PauliX, PauliY o PauliZ.
Range Rappresenta una sequenza ordinata di valori Int equidistanti. I valori possono rappresentare le sequenze in ordine crescente o decrescente.
Array Rappresenta valori contenenti ciascuno una sequenza di valori dello stesso tipo.
Tupla Rappresenta valori contenenti ciascuno un numero fisso di elementi di tipi diversi. Le tuple contenenti un singolo elemento sono equivalenti all'elemento che contengono.
Tipo definito dall'utente Rappresenta un tipo definito dall'utente costituito da elementi denominati e anonimi di tipi diversi. Le istanze dei valori vengono create richiamando il costruttore.
Operazione Rappresenta un elemento chiamabile non deterministico che accetta un argomento di input (possibilmente con valori di tupla) e restituisce un output (possibilmente con valori di tupla). Le chiamate ai valori dell'operazione possono avere effetti collaterali e l'output può variare per ogni chiamata anche se richiamato con lo stesso argomento.
Funzione Rappresenta un elemento chiamabile deterministico che accetta un argomento di input (possibilmente con valori di tupla) e restituisce un output (possibilmente con valori di tupla). Le chiamate ai valori della funzione non hanno effetti collaterali e l'output sarà sempre lo stesso dato lo stesso input.