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. |