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