İşlemler ve işlevler

kubit veri türünün açıklamasında daha ayrıntılı olarak açıklandığı gibi, kuantum hesaplamaları hedeflenen kuantum işlemcisinde yerel olarak desteklenen işlemlerin yan etkileri biçiminde yürütülür. Bunlar, aslında, Q#içindeki tek yan etkilerdir. Tüm türler sabit olduğundan, Q#'de açıkça temsil edilen bir değeri etkileyen hiçbir yan etki yoktur. Bu nedenle, belirli bir çağrılabilir uygulamanın bu yerel olarak uygulanan işlemlerden herhangi birini doğrudan veya dolaylı olarak çağırmadığı sürece, yürütmesi her zaman aynı girişin verildiği aynı çıkışı üretir.

Q#, bu tür belirleyici hesaplamaları işlevlere açıkça bölmenizi sağlar. Yerel olarak desteklenen yönergeler kümesi sabit olmadığından ve dilin kendisinde yerleşik olmadığından, tam olarak yapılandırılabilir ve Q# kitaplığı olarak ifade edilebildiğinden, işlevlerin yalnızca diğer işlevleri çağırabilmesini ve herhangi bir işlemi çağıramazsınız. Buna ek olarak, belirleyici olmayan, yani kuantum durumunu etkiledikleri için yerel yönergeler işlem olarak temsil edilir. Bu iki kısıtlamayla, işlevler giriş değerleri bilindiği anda değerlendirilebilir ve prensipte aynı giriş için hiçbir zaman birden çok kez değerlendirilmeye gerek kalmaz.

bu nedenle Q# iki tür çağrılabilen öğe: işlemler ve işlevler. Tüm çağrılabilenler giriş olarak tek bir bağımsız değişken (potansiyel olarak tanımlama grubu değerli) alır ve çıkış olarak tek bir değer (tanımlama grubu) üretir. İşlem türü, <TIn> => <TOut> is <Char>olarak ifade edilir; burada <TIn> bağımsız değişken türüyle, <TOut> dönüş türüyle değiştirilecek ve <Char>işlem özellikleriyle değiştirilecek. Herhangi bir özellik belirtilmesi gerekmiyorsa söz dizimi <TIn> => <TOut>için basitleşir. Benzer şekilde, işlev türleri <TIn> -> <TOut>olarak ifade edilir.

Bu determinizm garantisinin yanı sıra, operasyonlar ve işlevler arasında çok az fark vardır. Her ikisi de serbestçe geçirilebilen birinci sınıf değerlerdir; bunlar, aşağıdaki örnekte gösterildiği gibi diğer çağrılabilir öğelere dönüş değerleri veya bağımsız değişkenler olarak kullanılabilir:

function Pow<'T>(op : 'T => Unit, pow : Int) : 'T => Unit {
    return PowImpl(op, pow, _);
}

Her ikisi de daha önce Powtürü parametrized işlevi gibi türe parametrized bir tanım temelinde örneklenebilir ve örnekteki return deyiminde olduğu gibi kısmen uygulanabilir.

İşlem özellikleri

Giriş ve çıkış türü hakkındaki bilgilere ek olarak, işlem türü bir işlemin özellikleri hakkında bilgi içerir. Örneğin bu bilgiler, işlem tarafından desteklenen functor'ları açıklar. Ayrıca, iç gösterim ayrıca derleyici tarafından çıkarılan iyileştirmeyle ilgili bilgiler içerir.

Bir işlemin özellikleri önceden tanımlanmış ve yerleşik etiketler kümesidir. Bunlar, tür imzasının parçası olan özel bir ifade biçiminde ifade edilir. İfade, önceden tanımlanmış etiket kümelerinden birini veya desteklenen bir ikili işleç aracılığıyla özellik ifadelerinin birleşimini oluşturur.

önceden tanımlanmış iki küme vardır: Adj ve Ctl.

  • Adj, bir işlemin bitişik olduğunu belirten tek bir etiket içeren kümedir; yani Adjoint functor destekler ve uygulanan kuantum dönüşümü "geri alınabilir", yani ters çevrilebilir.
  • Ctl, bir işlemin denetlenebilir olduğunu belirten tek bir etiket içeren kümedir; yani Controlled functor destekler ve yürütmesi diğer kubitlerin durumuna göre koşullanabilir.

Özellik ifadelerinin bir parçası olarak desteklenen iki işleç, küme birleşim + ve küme kesişimi *. EBNF'de (Genişletilmiş Backus–Naur formu),

    predefined = "Adj" | "Ctl";
    characteristics = predefined 
        | "(", characteristics, ")" 
        | characteristics ("+"|"*") characteristics;

Bekleneceği gibi, *+'dan daha yüksek önceliğe sahiptir ve her ikisi de sol ilişkilendiricidir. Örneğin, birim işlem türü <TIn> => <TOut> is Adj + Ctlolarak ifade edilir ve burada <TIn> işlem bağımsız değişkeninin türüyle, <TOut> ise döndürülen değerin türüyle değiştirilmelidir.

Uyarı

Bu formdaki bir işlemin özelliklerini belirtmek iki önemli avantaja sahiptir; yeni etiketler, tüm etiket bileşimleri için üstel olarak birçok dil anahtar sözcüğüne sahip olmadan ortaya konabilir. Daha da önemlisi, bir işlemin özelliklerini belirtmek için ifadelerin kullanılması, gelecekte işlem özellikleri üzerinde parametreleştirmeleri de destekler.