Share via


Typsystem

Med fokus på kvantalgoritmer som är mer inriktade på vad som bör uppnås snarare än på en problemrepresentation när det gäller datastrukturer, är ett mer funktionellt perspektiv på språkdesign ett naturligt val. Samtidigt är typsystemet en kraftfull mekanism som kan användas för programanalys och andra kompileringskontroller som underlättar formuleringen av robust kod.

På det hela taget Q# är typsystemet ganska minimalistiskt, i den meningen att det inte finns en explicit uppfattning om klasser eller gränssnitt som man kan använda till från klassiska språk som C# eller Java. Vi har också ett något pragmatiskt tillvägagångssätt som gör inkrementella framsteg, så att vissa konstruktioner ännu inte är helt integrerade i typsystemet. Ett exempel är funktorer som kan användas i uttryck men som ännu inte har någon representation i typsystemet. På motsvarande sätt kan de för närvarande inte tilldelas eller skickas som argument, på liknande sätt som för parametriserade anropsbara typer. Vi förväntar oss att göra inkrementella framsteg när det gäller att utöka typsystemet så att det blir mer komplett och balansera omedelbara behov med långsiktiga planer.

Tillgängliga typer

Alla typer i Q# är oföränderliga.

Typ Description
Unit Representerar en singleton-typ vars enda värde är ().
Int Representerar ett 64-bitars signerat heltal. Värdena varierar från -9 223 372 036 854 775 808 till 9 223 372 036 854 775 807.
BigInt Representerar signerade heltalsvärden av valfri storlek.
Double Representerar ett 64-bitars flyttalsnummer med dubbel precision. Värdena sträcker sig från -1,79769313486232e308 till 1,79769313486232e308 samt NaN (inte ett tal).
Bool Representerar booleska värden. Möjliga värden är true eller false.
String Representerar text som värden som består av en sekvens med UTF-16-kodenheter.
Qubit Representerar en täckande identifierare med vilken virtuellt kvantminne kan åtgärdas. Värden av typen Qubit instansieras via allokering.
Result Representerar resultatet av ett projektivt mått på en kvantoperators egenrymder med egenvärde ±1. Möjliga värden är Zero eller One.
Pauli Representerar en Pauli-matris med en enda qubit. Möjliga värden är PauliI, PauliX, PauliYeller PauliZ.
Range Representerar en ordnad sekvens med lika fördelade Int värden. Värden kan representera sekvenser i stigande eller fallande ordning.
Matris Representerar värden som var och en innehåller en sekvens med värden av samma typ.
Tupel Representerar värden som var och en innehåller ett fast antal objekt av olika typer. Tupplar som innehåller ett enda element motsvarar det element som de innehåller.
Användardefinierad typ Representerar en användardefinierad typ som består av namngivna och anonyma objekt av olika typer. Värden instansieras genom att konstruktorn anropas.
Åtgärd Representerar en icke-deterministisk anropsbar som tar ett (eventuellt tuppeln-värderat) indataargument returnerar en (eventuellt tuppeln-värderad) utdata. Anrop till åtgärdsvärden kan ha sidoeffekter och utdata kan variera för varje anrop även när de anropas med samma argument.
Funktion Representerar en deterministisk anropsbar som tar ett (eventuellt tupppelvärdes) indataargument som returnerar en (eventuellt tupppelvärdes) utdata. Anrop till funktionsvärden har inga sidoeffekter och utdata är alltid desamma med samma indata.