System typów
Skupienie się na algorytmie kwantowym jest bardziej ukierunkowane na to, co należy osiągnąć, a nie na reprezentacji problemu w zakresie struktur danych, biorąc bardziej funkcjonalną perspektywę projektowania języka jest naturalnym wyborem. Jednocześnie system typów jest zaawansowanym mechanizmem, którego można użyć do analizy programu i innych testów czasu kompilacji, które ułatwiają tworzenie niezawodnego kodu.
W sumie Q# system typów jest dość minimalistyczny, w tym sensie, że nie ma jawnego pojęcia klas lub interfejsów, ponieważ można ich używać z języków klasycznych, takich jak C# lub Java. Podejmujemy również nieco pragmatyczne podejście do przyrostowego postępu, tak aby niektóre konstrukcje nie zostały jeszcze w pełni zintegrowane z systemem typów. Przykładem są funktory, które mogą być używane w wyrażeniach, ale nie mają jeszcze reprezentacji w systemie typów. W związku z tym nie można ich obecnie przypisać ani przekazać jako argumenty, podobnie jak w przypadku typu parametryzowanych obiektów wywołujących. Spodziewamy się, że przyrostowy postęp w rozszerzeniu systemu typów będzie bardziej kompletny i zrównoważymy natychmiastowe potrzeby z długoterminowymi planami.
Dostępne typy
Wszystkie typy w programie Q# są niezmienne.
Typ | Opis |
---|---|
Unit |
Reprezentuje pojedynczy typ, którego jedyną wartością jest () . |
Int |
Reprezentuje 64-bitową liczbę całkowitą ze znakiem. Wartości wahają się od -9 223 372 036 854 775 808 do 9 223 372 036 854 775 807. |
BigInt |
Reprezentuje podpisane wartości całkowite dowolnego rozmiaru. |
Double |
Przedstawia liczbę zmiennoprzecinkową o podwójnej precyzji 64-bitowej. Wartości wahają się od -1,79769313486232e308 do 1,79769313486232e308, a także NaN (a nie liczba). |
Bool |
Reprezentuje wartości logiczne. Możliwe wartości to true lub false . |
String |
Reprezentuje tekst jako wartości składające się z sekwencji jednostek kodu UTF-16. |
Qubit |
Reprezentuje nieprzezroczysty identyfikator, za pomocą którego można rozwiązać problem z wirtualną pamięcią kwantową.
Wartości typu Qubit są tworzone za pośrednictwem alokacji. |
Result |
Reprezentuje wynik miary projektowej w przestrzeniach generacyjnych operatora kwantowego z wartościami eigenvalue ±1. Możliwe wartości to Zero lub One . |
Pauli |
Reprezentuje macierz Pauli z jednym kubitem. Możliwe wartości to PauliI , PauliX , PauliY lub PauliZ . |
Range |
Reprezentuje uporządkowaną sekwencję równomiernie rozmieszczonych Int wartości.
Wartości mogą reprezentować sekwencje w kolejności rosnącej lub malejącej. |
Tablica | Reprezentuje wartości , z których każda zawiera sekwencję wartości tego samego typu. |
Krotki | Reprezentuje wartości , z których każda zawiera stałą liczbę elementów różnych typów. Krotki zawierające pojedynczy element są równoważne elementowi, który zawierają. |
Typ zdefiniowany przez użytkownika | Reprezentuje typ zdefiniowany przez użytkownika składający się z nazwanych i anonimowych elementów różnych typów. Wartości są tworzone przez wywołanie konstruktora. |
Operacja | Reprezentuje niedeterministyczne wywołanie , które przyjmuje jeden (prawdopodobnie wartość krotki) argument wejściowy zwraca jeden (ewentualnie wartość krotki) danych wyjściowych. Wywołania wartości operacji mogą mieć skutki uboczne, a dane wyjściowe mogą się różnić w przypadku każdego wywołania nawet w przypadku wywołania z tym samym argumentem. |
Funkcja | Reprezentuje deterministyczną metodę wywołującą , która przyjmuje jeden (prawdopodobnie wartość krotki) argument wejściowy zwraca jeden (prawdopodobnie wartość krotki) danych wyjściowych. Wywołania do wartości funkcji nie mają skutków ubocznych, a dane wyjściowe będą zawsze takie same, biorąc pod uwagę te same dane wejściowe. |