Typensystem

Da der Fokus für den Quantenalgorithmus eher darauf liegt, was erreicht werden sollte, als auf einer Problemdarstellung in Bezug auf Datenstrukturen, ist es eine natürliche Wahl, eine funktionalere Perspektive auf den Sprachentwurf zu nehmen. Gleichzeitig ist das Typsystem ein leistungsstarker Mechanismus, der für die Programmanalyse und andere Überprüfungen zur Kompilierzeit genutzt werden kann, die das Formulieren von stabilem Code erleichtern.

Insgesamt ist das Q#-Typsystem ziemlich minimalistisch, in dem Sinne, dass es kein explizites Konzept von Klassen oder Schnittstellen gibt, wie es von klassischen Sprachen wie C# oder Java verwendet werden kann. Wir verfolgen auch einen etwas pragmatischen Ansatz, um inkrementelle Fortschritte zu erzielen, damit bestimmte Konstrukte noch nicht vollständig in das Typsystem integriert sind. Ein Beispiel sind Funktionselemente, die in Ausdrücken verwendet werden können, aber noch keine Darstellung im Typsystem haben. Entsprechend können sie derzeit nicht als Argumente zugewiesen oder übergeben werden, ähnlich wie bei typparametrisierten Aufrufen. Wir erwarten inkrementelle Fortschritte bei der Erweiterung des Typsystems, um vollständiger zu sein und sofortige Anforderungen mit längerfristigen Plänen in Balance zu bringen.

Verfügbare Typen

Alle Typen in Q# sind unveränderlich.

type BESCHREIBUNG
Unit Stellt einen Singletontyp dar, dessen einziger Wert () ist.
Int Stellt eine 64-Bit-Ganzzahl mit Vorzeichen dar. Die Werte liegen im Bereich von 9 223 372 036 854 775 808 bis 9 223 372 036 854 775 807.
BigInt Stellt ganzzahlige Werte einer beliebigen Größe mit Vorzeichen dar.
Double Stellt 64-Bit-Gleitkommazahlen mit doppelter Genauigkeit dar. Die Werte reichen von -1,79769313486232e308 bis 1,79769313486232e308 sowie NaN (keine Zahl).
Bool Stellt boolesche Werte dar. Mögliche Werte sind true oder false.
String Stellt Text als Werte dar, bestehend aus einer Sequenz von UTF-16-Codeeinheiten.
Qubit Stellt einen nicht transparenten Bezeichner dar, mit dem virtueller Quantenspeicher adressiert werden kann. Werte vom Typ Qubit werden über die Zuordnung instanziiert.
Result Stellt das Ergebnis einer projektiven Messung auf die Eigenspaces eines Quantenoperators mit Eigenwerten ±1 dar. Mögliche Werte sind Zero oder One.
Pauli Stellt eine Pauli-Matrix mit einem einzelnen Qubit dar. Mögliche Werte sind PauliI, PauliX, PauliY oder PauliZ.
Range Stellt eine geordnete Sequenz von Werten mit gleichem Abstand Int dar. Werte können Sequenzen in aufsteigender oder absteigender Reihenfolge darstellen.
Array Stellt Werte dar, die jeweils eine Sequenz von Werten desselben Typs enthalten.
Tupel Stellt Werte dar, die jeweils eine feste Anzahl von Elementen unterschiedlicher Typen enthalten. Tupel, die ein einzelnes Element enthalten, entsprechen dem Element, das sie enthalten.
Benutzerdefinierter Typ Stellt einen benutzerdefinierten Typ dar, der aus benannten und anonymen Elementen verschiedener Typen besteht. Werte werden durch Aufrufen des Konstruktors instanziiert.
Vorgang Stellt einen nicht deterministischen Aufruf dar, der ein (möglicherweise tupelwertiges) Eingabeargument verwendet, das eine (möglicherweise Tupelwert-) Ausgabe zurückgibt. Aufrufe von Vorgangswerten können Nebeneffekte haben, und die Ausgabe kann für jeden Aufruf variieren, selbst wenn sie mit demselben Argument aufgerufen wird.
Funktion Stellt einen nicht deterministischen Aufruf dar, der ein (möglicherweise tupelwertiges) Eingabeargument verwendet, das eine (möglicherweise Tupelwert-) Ausgabe zurückgibt. Aufrufe von Funktionswerten haben keine Nebeneffekte, und die Ausgabe ist bei der gleichen Eingabe immer identisch.