Deklaracje typów

Q# obsługuje typy zdefiniowane przez użytkownika. Typy zdefiniowane przez użytkownika są podobne do typów rekordów w języku F#; są niezmienne, ale obsługują konstrukcję kopiowania i aktualizacji .

Typy definiowane przez użytkownika

Typy zdefiniowane przez użytkownika mogą zawierać elementy nazwane i anonimowe. Następująca deklaracja w przestrzeni nazw, na przykład, definiuje typ Complex , który ma dwa nazwane elementy Real i Imaginary, oba typu Double:

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

Obsługiwana jest dowolna kombinacja nazwanych i nienazwanych elementów, a elementy wewnętrzne również mogą być nazwane. Na przykład typ Nested, zdefiniowany jako

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

Zawiera dwa anonimowe elementy typu Double i String odpowiednio oraz nazwany element ItemName typu Int.

Dostęp do zawartych elementów można uzyskać za pośrednictwem ich nazwy lub dekonstrukcji (aby uzyskać więcej informacji, zobacz dostęp do elementów). Dostęp do krotki wszystkich elementów, w których kształt jest zgodny z elementem zdefiniowanym w deklaracji, można również uzyskać dostęp za pośrednictwem operatora unwrap.

Typy zdefiniowane przez użytkownika są przydatne z dwóch powodów. Po pierwsze, o ile biblioteki i programy korzystające ze zdefiniowanych typów uzyskują dostęp do elementów za pośrednictwem ich nazwy, a nie przez dekonstrukcję, można rozszerzyć typ tak, aby zawierał dodatkowe elementy później bez przerywania kodu biblioteki. W związku z tym uzyskiwanie dostępu do elementów za pośrednictwem dekonstrukcji jest zwykle zniechęcane.

Po drugie, umożliwia przekazanie intencji i oczekiwań dla określonego typu danych, Q# ponieważ nie ma automatycznej konwersji między wartościami dwóch typów zdefiniowanych przez użytkownika, nawet jeśli ich typy elementów są identyczne.

Konstruktory zdefiniowane przez użytkownika

Konstruktory dla typów zdefiniowanych przez użytkownika są generowane automatycznie przez kompilator. Obecnie nie można zdefiniować konstruktora niestandardowego, chociaż może to być dodatek do języka w przyszłości.