Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Genel kapsamda bildirilen çağrılabilen bildirimler veya çağrılabilenvarsayılan olarak genel olarak görünür; diğer bir ifadeyle, aynı projede ve bildirildikleri derlemeye başvuran bir projede kullanılabilirler. Access değiştiricileri, uygulama ayrıntılarının daha sonra belirli bir kitaplığı temel alan koda gerek kalmadan değiştirilebileceği şekilde yalnızca geçerli derlemeyle görünürlüklerini kısıtlamanıza olanak sağlar.
Q# iki tür çağrılabilir öğeyi destekler: işlemler ve işlevler. İşlemler ve İşlevler konusu, ikisi arasındaki ayrımı ayrıntılı olarak açıklar. Q# şablonları tanımlamayı da destekler; örneğin, belirli bir çağrılabilen için tür parametreli uygulamalar. Daha fazla bilgi için bkz. Tür parametreleştirmeleri.
Uyarı
Bu tür parametrized uygulamalar, tür bağımsız değişkenlerinin belirli özelliklerine dayanan herhangi bir dil yapısı kullanmayabilir; şu anda Q#'de tür kısıtlamalarını ifade etmenin veya belirli tür bağımsız değişkenleri için özel uygulamalar tanımlamanın hiçbir yolu yoktur.
Çağrılabilenler ve functor'lar
Q# belirli amaçlar için özel uygulamalara izin verir; örneğin, Q# işlemleri, belirlifunctor'lar için örtük veya açıkça destek tanımlayabilir ve bununla birlikte belirli bir functor bu çağrılabilir öğesine uygulandığında çağrılacak özel uygulamaları tanımlayabilir.
Bir anlamda functor, uygulandığı çağrılabilir öğeyle belirli bir ilişkisi olan yeni çağrılabilen bir uygulamayı tanımlayan bir fabrikadır. Functor'lar, uygulandıkları çağrılabilenin uygulama ayrıntılarına erişmeleri gereken geleneksel üst düzey işlevlerden daha fazlasıdır. Bu anlamda şablonlar gibi diğer fabrikalara benzerler. Bunlar tür parametreli çağrılabilen öğelere de uygulanabilir.
aşağıdaki işlemi göz önünde bulundurun 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]));
}
}
}
Bu işlem Qubit[] türünde bir bağımsız değişken alır ve Unittüründe bir değer döndürür.
ApplyQFT bildiriminde ek açıklama is Adj + Ctl, işlemin hem Adjoint hem de Controlled functor'ı desteklediğini gösterir. (Daha fazla bilgi için bkz. İşlem özellikleri).
Adjoint ApplyQFT ifadesi, ApplyQFTöğesinin bitişikliklerini uygulayan özelleştirmeye erişir ve Controlled ApplyQFTApplyQFTdenetimli sürümünü uygulayan uzmanlaştırmaya erişir.
Özgün işlemin bağımsız değişkenine ek olarak, bir işlemin denetimli sürümü bir dizi denetim kubiti alır ve özgün işlemi tüm bu denetim kubitlerinin |1⟩ durumunda olması koşuluyla uygular.
Teoride, bir bitişik sürümün tanımlanabildiği bir işlemin de kontrollü bir sürümü olmalıdır ve bunun tersi de geçerlidir. Ancak uygulamada, özellikle başarıya kadar tekrarlanan deseni izleyen olasılıksal uygulamalar için bir uygulama geliştirmek zor olabilir. Bu nedenle, Q# her bir functor için ayrı ayrı destek bildirmenize olanak tanır. Ancak, iki funktör de geldiğinden, her ikisi için de desteği tanımlayan bir işlemin, her iki functor'ın da işleme uygulandığında bir uygulaması (genellikle örtük olarak tanımlanmış, derleyici tarafından oluşturulan anlamına gelir) olması gerekir.
İşlevlere uygulanabilecek hiçbir funktör yoktur. İşlevler şu anda tam olarak tek bir gövde uygulamasına sahiptir ve başka uzmanlıkları yoktur. Örneğin, bildirimi
function Hello (name : String) : String {
$"Hello, {name}!"
}
eşittir
function Hello (name : String) : String {
body ... {
$"Hello, {name}!"
}
}
Burada, body verilen uygulamanın Helloişlevinin varsayılan gövdesi için geçerli olduğunu belirtir. Bu, çağırmadan önce hiçbir functor veya başka fabrika mekanizması uygulanmadığında uygulamanın çağrılacağı anlamına gelir.
body ... içindeki üç nokta, işlev bildirimindeki bağımsız değişken öğelerinin kopyalanıp bu noktaya yapıştırılması gerektiğini belirten bir derleyici yönergesine karşılık gelir.
Üst çağrılabilen bildirimin bağımsız değişkenlerinin kopyalanıp yapıştırılmasını açıkça belirten nedenler iki kattır: bir, bağımsız değişken bildirimini yinelemek gereksizdir ve iki, Controlled functor gibi ek bağımsız değişkenler gerektiren functor'ların tutarlı bir şekilde tanıtılabilmesini sağlar.
Varsayılan gövdenin uygulamasını tanımlayan tam olarak bir özelleştirme olduğunda, form body ... { <implementation> } ek sarmalama atlanabilir.
Özyineleme
Q# çağrılabilenler doğrudan veya dolaylı olarak özyinelemeli olabilir ve herhangi bir sırada bildirilebilir; bir işlem veya işlev kendisini çağırabilir veya doğrudan veya dolaylı olarak çağıran başka bir çağrılabilir çağırabilir.
Kuantum donanımında çalıştırılırken yığın alanı sınırlı olabilir ve bu yığın alanı sınırını aşan özyinelemeler çalışma zamanı hatasına neden olabilir.