Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Sebagaimana diuraikan secara lebih rinci dalam deskripsi jenis data kuantum, komputasi kuantum dijalankan dalam bentuk efek samping operasi yang didukung secara asli pada prosesor kuantum yang ditargetkan. Ini, pada kenyataannya, satu-satunya efek samping di Q#. Karena semua jenis tidak dapat diubah, tidak ada efek samping yang berdampak pada nilai yang secara eksplisit diwakili dalam Q#. Oleh karena itu, selama implementasi panggilan tertentu tidak secara langsung atau tidak langsung memanggil salah satu operasi yang diterapkan secara asli ini, eksekusinya selalu menghasilkan output yang sama, mengingat input yang sama.
Q# memungkinkan Anda untuk secara eksplisit membagi komputasi deterministik murni tersebut menjadi fungsi. Karena serangkaian instruksi yang didukung secara asli tidak diperbaiki dan dibangun ke dalam bahasa itu sendiri, melainkan sepenuhnya dapat dikonfigurasi dan dinyatakan sebagai Q# pustaka, determinisme dijamin dengan mengharuskan fungsi hanya dapat memanggil fungsi lain dan tidak dapat memanggil operasi apa pun. Selain itu, instruksi asli yang tidak deterministik, yaitu, karena berdampak pada status kuantum, direpresentasikan sebagai operasi. Dengan dua batasan ini, fungsi dapat dievaluasi segera setelah nilai input mereka diketahui, dan, pada prinsipnya, tidak perlu dievaluasi lebih dari sekali untuk input yang sama.
Q# oleh karena itu membedakan antara dua jenis panggilan: operasi dan fungsi. Semua panggilan mengambil argumen tunggal (berpotensi bernilai tuple) sebagai input dan menghasilkan satu nilai (tuple) sebagai output. Secara sintaksis, jenis operasi diekspresikan sebagai <TIn> => <TOut> is <Char>, di mana <TIn> harus diganti dengan jenis argumen, <TOut> harus diganti dengan jenis yang ditampilkan, dan <Char> harus diganti dengan karakteristik operasi. Jika tidak ada karakteristik yang perlu ditentukan, sintaks akan disederhanakan menjadi <TIn> => <TOut>. Demikian pula, jenis fungsi diekspresikan sebagai <TIn> -> <TOut>.
Selain jaminan determinisme ini, ada sedikit perbedaan antara operasi dan fungsi. Keduanya adalah nilai kelas satu yang dapat diteruskan secara bebas; mereka dapat digunakan sebagai nilai pengembalian atau argumen ke panggilan lain, seperti yang ditunjukkan dalam contoh berikut:
function Pow<'T>(op : 'T => Unit, pow : Int) : 'T => Unit {
return PowImpl(op, pow, _);
}
Keduanya dapat diinstansiasi berdasarkan definisi berparametri jenis, misalnya, fungsi Powberparametri jenis di atas, dan dapat diterapkan sebagian seperti yang dilakukan dalam return pernyataan dalam contoh.
Karakteristik operasi
Selain informasi tentang jenis input dan output, jenis operasi berisi informasi tentang karakteristik operasi. Informasi ini, misalnya, menjelaskan funktor apa yang didukung oleh operasi. Selain itu, representasi internal juga berisi informasi relevan pengoptimalan yang disimpulkan oleh kompilator.
Karakteristik operasi adalah satu set label yang telah ditentukan dan label bawaan. Karakteristik tersebut diekspresikan dalam bentuk ekspresi khusus yang merupakan bagian dari tanda tangan jenis. Ekspresi ini terdiri dari salah satu dari suatu set label yang telah ditentukan, atau merupakan kombinasi ekspresi karakteristik melalui operator biner yang didukung.
Ada dua set yang telah ditentukan, yaitu Adj dan Ctl.
-
Adjadalah set yang berisi satu label yang menunjukkan bahwa operasi dapat digabungkan, yang berarti mendukungAdjointfunktor dan transformasi kuantum yang diterapkan dapat "dibatalkan", artinya, dapat dibalik. -
Ctladalah set yang berisi satu label yang menunjukkan bahwa operasi dapat dikontrol, yang berarti mendukungControlledfunktor dan eksekusinya dapat dikondisikan pada status kubit lainnya.
Dua operator yang didukung sebagai bagian dari ekspresi karakteristik adalah set gabungan + dan set persimpangan *.
Di EBNF,
predefined = "Adj" | "Ctl";
characteristics = predefined
| "(", characteristics, ")"
| characteristics ("+"|"*") characteristics;
Seperti yang diharapkan, * memiliki prioritas yang lebih tinggi daripada +, dan keduanya terkait dengan kiri. Jenis operasi uniter, misalnya, dinyatakan sebagai <TIn> => <TOut> is Adj + Ctl, di mana <TIn> harus diganti dengan jenis argumen operasi, dan <TOut> diganti dengan jenis nilai yang dikembalikan.
Catatan
Penggambaran karakteristik operasi dalam bentuk ini memiliki dua keunggulan utama; salah satunya yaitu label baru dapat diperkenalkan tanpa memiliki banyak kata kunci bahasa secara eksponensial untuk semua kombinasi label. Mungkin yang lebih penting, menggunakan ekspresi untuk menunjukkan karakteristik operasi juga mendukung parameterisasi atas karakteristik operasi di masa depan.