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