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. |