Système de types
L'algorithme quantique étant davantage axé sur ce qui doit être réalisé que sur une représentation du problème en termes de structures de données, l'adoption d'une perspective plus fonctionnelle de la conception du langage s’impose naturellement. En même temps, le système de type est un mécanisme puissant dont il est possible de tirer profit à des fins d’analyse des programmes et d'autres vérifications au moment de la compilation afin de faciliter la formulation d'un code fiable.
Dans l’ensemble, le système de types Q# est assez minimaliste, dans le sens où il n'y a pas de notion explicite de classes ou d'interfaces comme on peut en avoir l'habitude dans des langages classiques comme C# ou Java. Nous adoptons également une approche quelque peu pragmatique en suivant une progression incrémentielle, de sorte que certaines constructions ne sont pas encore totalement intégrées dans le système de type. Les foncteurs, qui peuvent être utilisés dans les expressions sans représentation dans le système de type, en sont un exemple. En conséquence, ils ne peuvent actuellement pas être attribués ou transmis en tant qu’arguments, comme c'est le cas pour les callables paramétrés par type. Nous prévoyons de suivre une progression incrémentielle en étendant le système de type pour qu’il soit plus complet, et d’équilibrer les besoins immédiats avec les plans à plus long terme.
Types disponibles
Tous les types présents dans Q# sont immuables.
Type | Description |
---|---|
Unit |
Représente un type singleton dont la seule valeur est () . |
Int |
Représente un entier signé 64 bits. Les valeurs sont comprises entre -9,223,372,036,854,775,808 et 9,223,372,036,854,775,807. |
BigInt |
Représente des valeurs entières signées de toute taille. |
Double |
Représente un nombre à virgule flottante 64 bits double précision. Les valeurs sont comprises entre -1.79769313486232e308 et 1.79769313486232e308 ainsi que NAN (n'est pas un nombre). |
Bool |
Représente des valeurs booléennes. Les valeurs possibles sont true ou false . |
String |
Représente du texte sous forme de valeurs correspondant à une séquence d’unités de code UTF-16. |
Qubit |
Représente un identifiant opaque par lequel la mémoire quantique virtuelle peut être adressée. Les valeurs de type Qubit sont instanciées par le biais d’une allocation. |
Result |
Représente le résultat d’une mesure projective sur les espaces propres d’un opérateur quantique avec des valeurs propres ±1. Les valeurs possibles sont Zero ou One . |
Pauli |
Représente une matrice de Pauli à un seul qubit. Les valeurs possibles sont PauliI , PauliX , PauliY ou PauliZ . |
Range |
Représente une séquence ordonnée de valeurs Int espacées de façon égale. Les valeurs peuvent représenter des séquences dans l’ordre croissant ou décroissant. |
Array | Représente des valeurscontenant chacune une séquence de valeurs du même type. |
Tuple | Représente des valeurscontenant chacune un nombre fixe d’éléments de types différents. Les tuples contenant un seul élément sont équivalents à l’élément qu’ils contiennent. |
Type défini par l’utilisateur | Représente un type défini par l’utilisateur qui se compose d’éléments nommés et anonymes de types différents. Les valeurs sont instanciées en appelant le constructeur. |
Opération | Représente un callable non déterministe qui prend un argument d'entrée (éventuellement à valeur de tuple) et renvoie une sortie (éventuellement à valeur de tuple). Les appels à des valeurs d’opération peuvent s’accompagner d’effets secondaires et la sortie peut varier pour chaque appel, même en cas d’appel avec le même argument. |
Fonction | Représente un callable déterministe qui prend un argument d'entrée (éventuellement à valeur de tuple) et renvoie une sortie (éventuellement à valeur de tuple). Les appels à des valeurs de fonction ne s’accompagnent pas d’effets secondaires et la sortie est la même si l’entrée est la même. |