Sistema de tipos

Como el enfoque del algoritmo cuántico se centra más en lo que se debe conseguir que en una representación del problema en términos de estructuras de datos, adoptar una perspectiva más funcional en el diseño del lenguaje es una elección natural. Al mismo tiempo, el sistema de tipos es un poderoso mecanismo que puede aprovecharse para el análisis de programas y otras comprobaciones en tiempo de compilación que facilitan la formulación de código sólido.

En resumen, el sistema de tipos Q# es bastante sencillo, en el sentido de que no hay una noción explícita de clases o interfaces como a la que estamos acostumbrados en lenguajes clásicos como C# o Java. También adoptamos un enfoque un tanto pragmático que hace que el progreso sea incremental, de manera que ciertas construcciones no están todavía completamente integradas en el sistema de tipos. Un ejemplo son los funtores, que pueden utilizarse dentro de las expresiones pero que todavía no tienen una representación en el sistema de tipos. En consecuencia, no se pueden asignar o pasar como argumentos, al igual que ocurre con las llamadas parametrizadas. Esperamos hacer un progreso gradual en la ampliación del sistema de tipos para que sea más completo y equilibrar las necesidades inmediatas con los planes a largo plazo.

Tipos disponibles

Todos los tipos de Q# son inmutables.

Tipo Descripción
Unit Representa un tipo singleton cuyo único valor es ().
Int Representa un entero de 64 bits con signo. Los valores van de -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807.
BigInt Representa valores enteros con signo de cualquier tamaño.
Double Representa un número de punto flotante de 64 bits de doble precisión. Los valores van de -1,79769313486232e308 a 1,79769313486232e308, así como NaN (no es un número).
Bool Representa valores booleanos. Los valores posibles son true o false.
String Representa texto como valores que consisten en una secuencia de unidades de código UTF-16.
Qubit Representa un identificador opaco con el que se puede direccionar la memoria cuántica virtual. Los valores de tipo Qubit crean una instancia mediante asignación.
Result Representa el resultado de una medición proyectiva sobre los espacios propios de un operador cuántico con valores propios ±1. Los valores posibles son Zero o One.
Pauli Representa una matriz Pauli de un solo cúbit. Los valores posibles son PauliI, PauliX, PauliY, o PauliZ.
Range Representa una secuencia ordenada de valores Int igualmente espaciados. Los valores pueden representar secuencias en orden ascendente o descendente.
Array Representa valores que contienen cada uno una secuencia de valores del mismo tipo.
Tuple Representa valores que contienen cada uno un número fijo de elementos de diferentes tipos. Las tuplas que contienen un solo elemento son equivalentes al elemento que contienen.
Tipo definido por el usuario Representa un tipo definido por el usuario que consiste en elementos nombrados y anónimos de diferentes tipos. Los valores crean una instancia al invocar el constructor.
Operación Representa una invocación no determinista que toma un argumento de entrada (posiblemente con valor de tupla) y devuelve una salida (posiblemente con valor de tupla). Las invocaciones a los valores de la operación pueden tener efectos secundarios y la salida puede variar en cada invocación, incluso cuando se invoca con el mismo argumento.
Función Representa una invocación determinista que toma un argumento de entrada (posiblemente con valor de tupla) y devuelve una salida (posiblemente con valor de tupla). Las invocaciones a los valores de la función no tienen efectos secundarios y la salida es siempre la misma dada la misma entrada.