共用方式為


結束

關閉是可從封入環境擷取變數的可呼叫專案。 您可以建立函式和作業關閉。 作業關閉可以在函式內建立,但只能在作業中套用。

Q# 有兩種建立關閉的機制:Lambda 運算式和部分應用程式。

Lambda 運算式

Lambda 運算式會建立匿名函式或作業。 基本語法是用來系結參數的符號元組、函式和 => 作業) 的箭號 (-> ,以及套用時要評估的運算式。

// 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

參數

參數會使用與 變數宣告語句左側相同的符號元組進行系結。 參數 Tuple 的類型是隱含的。 不支援類型批註;如果類型推斷失敗,您可能需要建立最上層可呼叫宣告,並改用部分應用程式。

可變擷取變數

無法擷取可變變數。 如果您只需要在建立 Lambda 運算式時擷取可變變數的值,您可以建立不可變的複本:

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

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

特性

匿名作業的特性會根據 Lambda 的應用程式來推斷。 如果 Lambda 與函式應用程式搭配使用,或在預期特性的內容中,則會推斷 Lambda 具有該特性。 例如:

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 不同的特性,您必須改為建立最上層的作業宣告。

部分套用

部分應用程式是一種方便的速記,可用來套用可呼叫的引數,但並非所有的引數。 語法與呼叫運算式相同,但未套用的引數會取代為 _ 。 在概念上,部分應用程式相當於 Lambda 運算式,它會擷取套用的引數,並將未套用的引數當做參數。

例如,假設 f 是函式,而且 o 是作業,而且擷取的變數 x 是不可變的:

部分套用 Lambda 運算式
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))

可變擷取變數

不同于 Lambda 運算式,部分應用程式可以自動擷取可變變數值的複本:

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

這相當於下列 Lambda 運算式:

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

[^1]: 參數 Tuple 嚴格寫入 (a, (b)) ,但(b) 相當於 b