Typdeklarationen

Q# unterstützt benutzerdefinierte Typen. Benutzerdefinierte Typen sind ähnlich wie Datensatztypen in F#; sie sind unveränderlich, unterstützen aber ein Copy-and-Update-Konstrukt.

Benutzerdefinierte Typen

Benutzerdefinierte Typen können sowohl benannte als auch anonyme Elemente enthalten. Die folgende Deklaration innerhalb eines Namespace definiert z. B. den Typ Complex, der die zwei benannten Elemente Real und Imaginary hat, beide vom Typ Double:

    newtype Complex = (Real: Double, Imaginary : Double);

Jede Kombination aus benannten und unbenannten Elementen wird unterstützt, und innere Elemente können ebenfalls benannt werden. Beispielsweise enthält der Typ Nested, definiert als

newtype Nested = (Double, (ItemName : Int, String)); 

zwei anonyme Elemente vom Typ Double bzw. String und das benannte Element ItemName vom Typ Int.

Sie können auf die enthaltenen Elemente über ihren Namen oder durch Dekonstruktion zugreifen (weitere Informationen finden Sie unter Elementzugriff). Sie können auch über den Unwrap-Operator auf ein Tupel aller Elemente zugreifen, deren Form mit der in der Deklaration definierten Form übereinstimmt.

Benutzerdefinierte Typen sind aus zwei Gründen nützlich. Erstens: Solange die Bibliotheken und Programme, die die definierten Typen verwenden, auf die Elemente über ihren Namen und nicht durch Dekonstruktion zugreifen, kann der Typ später um zusätzliche Elemente erweitert werden, ohne den Bibliothekscode zu verändern. Aus diesem Grund wird generell davon abgeraten, über Dekonstruktion auf Elemente zuzugreifen.

Zweitens ermöglicht es Q#, die Absicht und die Erwartungen an einen bestimmten Datentyp zu vermitteln, da es keine automatische Konvertierung zwischen Werten zweier benutzerdefinierter Typen gibt, selbst wenn ihre Elementtypen identisch sind.

Zum Beispiel enthält die arithmetische Bibliothek quantenarithmetische Vorgänge sowohl für ganze Big-Endian als auch Little-Endian-Quantenzahlen. Sie definiert daher zwei Typen, BigEndian und LittleEndian, die beide ein einzelnes anonymes Element vom Typ Qubit[] enthalten:

    newtype BigEndian = Qubit[];
    newtype LittleEndian = Qubit[];

Mit diesen Typen können Vorgänge angeben, ob sie für Big-Endian- oder Little-Endian-Darstellungen geschrieben werden, und sie nutzen das Typsystem, um zur Kompilierzeit sicherzustellen, dass nicht übereinstimmende Operanden unzulässig sind.

Benutzerdefinierte Konstruktoren

Konstruktoren für benutzerdefinierte Typen werden automatisch vom Compiler generiert. Derzeit ist es nicht möglich, einen benutzerdefinierten Konstruktor zu definieren, obwohl dies in der Zukunft eine Ergänzung der Sprache sein könnte.