Declaraciones de tipos

Q# admite tipos definidos por el usuario. Los tipos definidos por el usuario son similares a los tipos de registro en F#; son inmutables, pero admiten una construcción de tipo copiar y actualizar.

Tipos definidos por el usuario

Los tipos definidos por el usuario pueden contener elementos con nombre y anónimos. La siguiente declaración dentro de un espacio de nombres, por ejemplo, define un tipo Complex que tiene dos elementos con nombre Real y Imaginary, ambos del tipo Double:

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

Se admite cualquier combinación de elementos con nombre y sin nombre, y los elementos internos también pueden tener nombre. Por ejemplo, el tipo Nested, definido como

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

contiene dos elementos anónimos del tipo Double y String respectivamente, y un elemento con nombre ItemName del tipo Int.

Puede acceder a los elementos incluidos por su nombre o por deconstrucción (para más información, consulte el artículo sobre el acceso a los elementos). También puede acceder a una tupla de todos los elementos donde la forma coincide con la definida en la declaración a través del operador unwrap.

Los tipos definidos por el usuario son útiles por dos motivos. En primer lugar, siempre que las bibliotecas y los programas que usan los tipos definidos accedan a los elementos por su nombre y no por deconstrucción, el tipo se puede extender para que contenga elementos adicionales más adelante sin que se rompa ningún código de biblioteca. Por eso, se desaconseja el acceso a los elementos por deconstrucción.

En segundo lugar, Q# permite transmitir la intención y las expectativas de un tipo de datos específico, ya que no hay ninguna conversión automática entre los valores de dos tipos definidos por el usuario, aunque los tipos de elemento sean idénticos.

Constructores definidos por el usuario

El compilador genera automáticamente constructores para tipos definidos por el usuario. Actualmente, no es posible definir un constructor personalizado, aunque esto podría agregarse al lenguaje en el futuro.