Deklarace typů

Q# podporuje uživatelsky definované typy. Uživatelem definované typy se podobají typům záznamů v jazyce F#; jsou neměnné, ale podporují konstruktor copy-and-update .

Uživateli definované typy

Uživatelem definované typy mohou obsahovat pojmenované i anonymní položky. Následující deklarace v rámci oboru názvů například definuje typ Complex , který má dvě pojmenované položky Real a Imaginary, obě typu Double:

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

Podporuje se libovolná kombinace pojmenovaných a nepojmenovaných položek a mohou být pojmenovány také vnitřní položky. Například typ Nested, definovaný jako

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

obsahuje dvě anonymní položky typu Double a String a pojmenovanou položku ItemName typu Int.

K obsaženým položkám můžete přistupovat prostřednictvím jejich názvu nebo pomocí dekonstrukce (další informace najdete v článku o přístupu k položkám). Můžete také získat přístup k řazené kolekci všech položek, kde obrazec odpovídá té definované v deklaraci prostřednictvím operátoru rozbalení.

Uživatelem definované typy jsou užitečné ze dvou důvodů. Zaprvé, pokud knihovny a programy, které používají definované typy, přistupují k položkám prostřednictvím jejich názvu místo dekonstrukce, lze tento typ později rozšířit tak, aby obsahoval další položky, aniž by se tím porušil kód knihovny. Z tohoto důvodu se obecně nedoporučuje přistupovat k položkám prostřednictvím dekonstrukce.

Za druhé, umožňuje vyjádřit záměr a očekávání pro konkrétní datový typ, Q# protože neexistuje žádný automatický převod mezi hodnotami dvou uživatelsky definovaných typů, a to ani v případě, že jejich typy položek jsou identické.

Například aritmetická knihovna obsahuje kvantové aritmetické operace pro celá kvantová čísla big-endian i little-endian. Proto definuje dva typy, BigEndian a LittleEndian, z nichž oba obsahují jednu anonymní položku typu Qubit[]:

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

Tyto typy umožňují operacím určit, jestli jsou napsané pro reprezentace typu big-endian nebo little-endian, a využívají systém typů k zajištění toho, že v době kompilace nejsou povolené neodpovídající operandy.

Uživatelem definované konstruktory

Konstruktory pro uživatelem definované typy jsou automaticky generovány kompilátorem. V současné době není možné definovat vlastní konstruktor, i když to může být v budoucnu doplněk jazyka.