Объявления типов

Q# поддерживает пользовательские типы. Пользовательские типы похожи на типы записей в F#: они неизменяемы, но поддерживают конструкцию копирования и обновления.

Определяемые пользователем типы

Пользовательские типы могут одновременно содержать именованные и анонимные элементы. Следующее объявление в пространстве имен, например, определяет тип Complex, который имеет два именованных элемента — Real и Imaginary — с типом Double:

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

Поддерживается любое сочетание именованных и неименованных элементов, при этом внутренние элементы также могут быть именованными. Например, тип Nested, определенный как

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

содержит два автономных элемента типа Double и String соответственно, а именованный элемент ItemName имеет тип Int.

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

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

Во-вторых, Q# позволяет передать намерение и ожидания для определенного типа данных, так как отсутствует автоматическое преобразование между значениями двух пользовательских типов, даже если их типы элементов одинаковы.

Пользовательские конструкторы

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