Система типов

Так квантовые алгоритмы ориентированы больше на результат, которого необходимо достичь, а не на представление задачи в терминах структур данных, естественным выбором стал функциональный подход к построению языка. В то же время система типов является эффективным механизмом для анализа программы и других проверок во время компиляции, упрощающих формулирование надежного кода.

В любом случае система типов Q# достаточно минималистична в том смысле, что не существует явного понятия классов или интерфейсов, которые могут быть привычны по классическим языкам, таким как C# или Java. Наш подход также можно назвать достаточно прагматичным: развитие происходит постепенно, так что некоторые конструкции еще не полностью интегрированы в систему типов. Примером могут служить функторы, которые можно использовать в выражениях, но которые еще не имеют представления в системе типов. Соответственно, в настоящее время их нельзя присваивать или передавать в качестве аргументов, как и в случае с вызываемыми объектами с параметризацией типов. Мы намерены постепенно расширять систему типов, чтобы сделать ее более полной, соблюдая при этом баланс между текущими потребностями и долгосрочными планами.

Доступные типы

Все типы в Q# являются неизменяемыми.

Тип Описание
Unit Представляет одноэлементный тип, единственное значение которого — ().
Int Представляет 64-разрядное целое число со знаком. Допустимы значения от 9 223 372 036 854 775 808 до 9 223 372 036 854 775 807.
BigInt Представляет целочисленные значения со знаком любого размера.
Double Представляет 64-разрядное число с плавающей точкой двойной точности. Допустимы значения от –1,79769313486232e308 до 1,79769313486232e308, а также значение NaN (не число).
Bool Представляет логические значения. Возможные значения: true или false.
String Представляет текст как значение, состоящее из последовательности единиц кода UTF-16.
Qubit Представляет непрозрачный идентификатор, по которому можно адресовать виртуальную квантовую память. Экземпляры значений типа Qubit создаются путем выделения.
Result Представляет результат измерения, проецированного в собственное пространство квантового оператора с собственными значениями ±1. Возможные значения — Zero и One.
Pauli Представляет однокубитную матрицу Паули. Возможные значения: PauliI, PauliX, PauliY и PauliZ.
Range Представляет упорядоченную последовательность равномерно распределенных значений типа Int. Значения могут представлять последовательности в порядке возрастания или убывания.
Array Представляет значения, каждое из которых содержит последовательность значений одного и того же типа.
Кортеж Представляет значения, каждое из которые содержит фиксированное число элементов разных типов. Кортежи, содержащие один элемент, эквивалентны этому элементу.
Пользовательский тип Представляет определяемый пользователем тип, состоящий из именованных и анонимных элементов разных типов. Экземпляры значений создаются путем вызова конструктора.
Операция Представляет недетерминированный вызываемый объект, принимающий один входной аргумент (возможно, кортеж) и возвращающий один результат (возможно, кортеж). Вызовы значений операций могут иметь побочные эффекты, и выходные данные могут различаться даже при одинаковых входных аргументах.
Функция Представляет детерминированный вызываемый объект, принимающий один входной аргумент (возможно, кортеж) и возвращающий один результат (возможно, кортеж). Вызовы значений функций не имеют побочных эффектов, и выходные данные при одинаковых входных аргументах всегда одинаковы.