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.
Deklarasi yang dapat dipanggil, atau panggilan, yang dinyatakan pada cakupan global terlihat secara publik secara default; artinya, mereka dapat digunakan di mana saja dalam proyek yang sama dan dalam proyek yang mereferensikan perakitan tempat mereka dideklarasikan. Pengubah akses memungkinkan Anda membatasi visibilitas mereka ke rakitan saat ini saja, sehingga detail implementasi dapat diubah nanti tanpa melanggar kode yang bergantung pada pustaka tertentu.
Q# mendukung dua jenis panggilan: operasi dan fungsi. Topik Operasi dan Fungsi menguraikan perbedaan antara keduanya. Q# juga mendukung penentuan templat ; misalnya, implementasi berparameter jenis untuk panggilan tertentu. Untuk informasi selengkapnya, lihat parameterisasi Jenis .
Nota
Implementasi berparametri jenis seperti itu mungkin tidak menggunakan konstruksi bahasa apa pun yang bergantung pada properti tertentu dari argumen jenis; saat ini tidak ada cara untuk mengekspresikan batasan jenis dalam Q#, atau untuk menentukan implementasi khusus untuk argumen jenis tertentu.
Callables dan funktor
Q# memungkinkan implementasi khusus untuk tujuan tertentu; misalnya, operasi di Q# dapat secara implisit atau eksplisit mendefinisikan dukungan untuk funktor tertentu, dan bersama dengan itu implementasi khusus untuk dipanggil ketika funktor tertentu diterapkan pada yang dapat dipanggil.
Functor, dalam arti tertentu, adalah pabrik yang mendefinisikan implementasi baru yang dapat dipanggil yang memiliki hubungan khusus dengan panggilan yang diterapkan. Funktor lebih dari fungsi tingkat lebih tinggi tradisional karena mereka memerlukan akses ke detail implementasi yang dapat dipanggil yang telah diterapkan. Dalam hal ini, mereka mirip dengan pabrik lain, seperti templat. Mereka juga dapat diterapkan ke callable berparameter jenis.
Pertimbangkan operasi berikut, ApplyQFT:
operation ApplyQFT(qs : Qubit[]) : Unit is Adj + Ctl {
let length = Length(qs);
Fact(length >= 1, "ApplyQFT: Length(qs) must be at least 1.");
for i in length - 1..-1..0 {
H(qs[i]);
for j in 0..i - 1 {
Controlled R1Frac([qs[i]], (1, j + 1, qs[i - j - 1]));
}
}
}
Operasi ini mengambil argumen jenis Qubit[] dan mengembalikan nilai jenis Unit. Anotasi is Adj + Ctl dalam deklarasi ApplyQFT menunjukkan bahwa operasi mendukung Adjoint dan funktor Controlled. (Untuk informasi selengkapnya, lihat karakteristik Operasi ). Ekspresi Adjoint ApplyQFT mengakses spesialisasi yang mengimplementasikan adjoint ApplyQFT, dan Controlled ApplyQFT mengakses spesialisasi yang mengimplementasikan versi terkontrol ApplyQFT.
Selain argumen operasi asli, versi operasi yang dikontrol mengambil array qubit kontrol dan menerapkan operasi asli pada kondisi bahwa semua qubit kontrol ini berada dalam status |1⟩.
Secara teori, operasi di mana versi adjoint dapat didefinisikan juga harus memiliki versi yang dikontrol dan sebaliknya. Namun, dalam praktiknya, mungkin sulit untuk mengembangkan implementasi untuk satu atau yang lain, terutama untuk implementasi probabilistik mengikuti pola pengulangan hingga keberhasilan. Untuk alasan itu, Q# memungkinkan Anda untuk mendeklarasikan dukungan untuk setiap funktor satu per satu. Namun, karena kedua funktor berkomunikasi, operasi yang mendefinisikan dukungan untuk keduanya juga harus memiliki implementasi (biasanya secara implisit didefinisikan, yang berarti dihasilkan kompilator) ketika kedua funktor diterapkan pada operasi.
Tidak ada funktor yang dapat diterapkan ke fungsi. Fungsi saat ini memiliki tepat satu implementasi tubuh dan tidak ada spesialisasi lebih lanjut. Misalnya, deklarasi
function Hello (name : String) : String {
$"Hello, {name}!"
}
setara dengan
function Hello (name : String) : String {
body ... {
$"Hello, {name}!"
}
}
Di sini, body menentukan bahwa implementasi yang diberikan berlaku untuk isi default fungsi Hello, yang berarti implementasi dipanggil ketika tidak ada funktor atau mekanisme pabrik lain yang telah diterapkan sebelum pemanggilan. Tiga titik dalam body ... sesuai dengan arahan kompilator yang menunjukkan bahwa item argumen dalam deklarasi fungsi harus disalin dan ditempelkan ke tempat ini.
Alasan di balik secara eksplisit menunjukkan di mana argumen deklarasi yang dapat dipanggil induk akan disalin dan ditempel adalah dua kali lipat: satu, tidak perlu mengulangi deklarasi argumen, dan dua, memastikan bahwa funktor yang memerlukan argumen tambahan, seperti Controlled funktor, dapat diperkenalkan secara konsisten.
Ketika ada tepat satu spesialisasi yang menentukan implementasi isi default, pembungkusan tambahan formulir body ... { <implementation> } dapat dihilangkan.
Rekursi
Q# dapat dilakukan secara langsung atau tidak langsung secara rekursif dan dapat dideklarasikan dalam urutan apa pun; operasi atau fungsi dapat memanggil dirinya sendiri, atau dapat memanggil panggilan lain yang secara langsung atau tidak langsung memanggil pemanggil.
Ruang tumpukan mungkin dibatasi saat berjalan pada perangkat keras kuantum, dan rekursi yang melebihi batas ruang tumpukan tersebut mengakibatkan kesalahan runtime.