Share via


Kapanışlar

Kapatmalar, kapsayan ortamdan değişkenleri yakalayan çağrılabilen öğelerdir. Hem işlev hem de işlem kapanışları oluşturulabilir. bir işlevin içinde işlem kapanışı oluşturulabilir, ancak yalnızca bir işlemde uygulanabilir.

Q# kapanışları oluşturmak için iki mekanizmaya sahiptir: lambda ifadeleri ve kısmi uygulama.

Lambda ifadeleri

Lambda ifadesi anonim bir işlev veya işlem oluşturur. Temel söz dizimi, parametreleri bağlamak için bir simge tanımlama grubu, bir ok (-> işlev ve => bir işlem için) ve uygulandığında değerlendirilecek bir ifadedir.

// Function that captures 'x':
y -> x + y

// Operation that captures 'qubit':
deg => Rx(deg * PI() / 180.0, qubit)

// Function that captures nothing:
(x, y) -> x + y

Parametreler

Parametreler, değişken bildirim deyiminin sol tarafındakiyle aynı olan bir sembol tanımlama grubu kullanılarak bağlanır. Parametre tanımlama grubu türü örtükdür. Tür ek açıklamaları desteklenmez; Tür çıkarımı başarısız olursa, üst düzey çağrılabilir bir bildirim oluşturmanız ve bunun yerine kısmi uygulama kullanmanız gerekebilir.

Değiştirilebilir yakalama değişkenleri

Değiştirilebilir değişkenler yakalanamaz. Lambda ifadesi oluşturulur oluşturulmaz yalnızca değiştirilebilir değişkenin değerini yakalamanız gerekiyorsa, sabit bir kopya oluşturabilirsiniz:

// ERROR: 'variable' cannot be captured.
mutable variable = 1;
let f = () -> variable;

// OK.
let value = variable;
let g = () -> value;

Özellikler

Anonim bir işlemin özellikleri, lambda uygulamalarına göre çıkarılır. Lambda bir functor uygulamasıyla veya bir özellik bekleyen bir bağlamda kullanılıyorsa, lambda bu özelliğe sahip olduğu çıkarsanır. Örnek:

operation NoOp(q : Qubit) : Unit is Adj {}
operation Main() : Unit {
    use q = Qubit();
    let foo = () => NoOp(q);
    foo(); // Has type Unit => Unit with no characteristics

    let bar = () => NoOp(q);
    Adjoint bar(); // Has type Unit => Unit is Adj
}

Lambda işlemi için çıkarılandan farklı özelliklere ihtiyacınız varsa, bunun yerine bir üst düzey işlem bildirimi oluşturmanız gerekir.

Kısmi uygulama

Kısmi uygulama, çağrılabilen bağımsız değişkenlerin tümünü değil bazılarını uygulamak için kullanışlı bir kısaltmadır. Söz dizimi bir çağrı ifadesiyle aynıdır, ancak uygulanmamış bağımsız değişkenler ile _değiştirilir. Kavramsal olarak kısmi uygulama, uygulanan bağımsız değişkenleri yakalayan ve uygulanmamış bağımsız değişkenleri parametre olarak alan lambda ifadesine eşdeğerdir.

Örneğin, bu f bir işlev ve o bir işlem olduğu ve yakalanan değişkenin x sabit olduğu göz önünde bulundurulduğunda:

Kısmi uygulama Lambda ifadesi
f(x, _) a -> f(x, a)
o(x, _) a => o(x, a)
f(_, (1, _)) (a, b) -> f(a, (1, b))[^1]
f((_, _, x), (1, _)) ((a, b), c) -> f((a, b, x), (1, c))

Değiştirilebilir yakalama değişkenleri

Lambda ifadelerinden farklı olarak kısmi uygulama, değiştirilebilir değişkenin değerinin bir kopyasını otomatik olarak yakalayabilir:

mutable variable = 1;
let f = Foo(variable, _);

Bu, aşağıdaki lambda ifadesiyle eşdeğerdir:

mutable variable = 1;
let value = variable;
let f = x -> Foo(value, x);

[^1]: Parametre tanımlama grubu kesin olarak yazılır(a, (b)), ancak (b) ile beşdeğerdir.