전역 범위에서 선언된 호출 가능한 선언 또는 호출 가능기본적으로 공개적으로 표시됩니다. 즉, 동일한 프로젝트 및 선언된 어셈블리를 참조하는 프로젝트에서 사용할 수 있습니다. Access 한정자는 특정 라이브러리를 사용하는 코드를 중단하지 않고 나중에 구현 세부 정보를 변경할 수 있도록 현재 어셈블리에 대한 표시 유형만 제한할 수 있습니다.
Q# 작업 및 함수라는 두 가지 종류의 호출 가능을 지원합니다. Operations 및 Functions 항목에서는 두 차이점을 자세히 설명합니다. Q# 템플릿 정의도 지원합니다. 예를 들어 특정 호출 가능 항목에 대한 형식 매개 변수가 있는 구현입니다. 자세한 내용은 형식 매개 변수화참조하세요.
메모
이러한 형식 매개 변수가 있는 구현은 형식 인수의 특정 속성을 사용하는 언어 구문을 사용할 수 없습니다. 현재 Q#형식 제약 조건을 표현하거나 특정 형식 인수에 대한 특수 구현을 정의할 수 있는 방법은 없습니다.
호출 가능 및 펀터
Q# 특정 목적을 위해 특수한 구현을 허용합니다. 예를 들어 Q# 작업은 특정functor에 대한 지원을 암시적으로 또는 명시적으로 정의할 수 있으며, 해당 호출 가능 항목에 특정 functor가 적용될 때 호출할 특수 구현도 함께 정의할 수 있습니다.
어떤 의미에서 functor는 적용된 호출 가능 항목과 특정 관계가 있는 호출 가능한 새 구현을 정의하는 팩터리입니다. Functor는 적용된 호출 가능의 구현 세부 정보에 액세스해야 한다는 측면에서 기존의 상위 수준 함수보다 더 많은 함수입니다. 그런 의미에서 템플릿과 같은 다른 공장과 비슷합니다. 형식 매개 변수가 있는 호출 가능 개체에도 적용할 수 있습니다.
다음 작업을 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]));
}
}
}
이 작업은 Qubit[] 형식의 인수를 사용하고 Unit형식의 값을 반환합니다.
ApplyQFT 선언에 is Adj + Ctl 주석은 작업이 Adjoint 및 Controlled functor를 모두 지원한다는 것을 나타냅니다. (자세한 내용은 작업 특성참조). 식 Adjoint ApplyQFTApplyQFT인접을 구현하는 특수화에 액세스하고 Controlled ApplyQFT 제어된 버전의 ApplyQFT구현하는 특수화에 액세스합니다.
원래 작업의 인수 외에도 제어된 버전의 연산은 컨트롤 큐비트의 배열을 사용하고 이러한 모든 컨트롤 큐비트가 |1⟩ 상태인 조건에 원래 작업을 적용합니다.
이론적으로 인접 버전을 정의할 수 있는 작업에는 제어된 버전도 있어야 하고 그 반대의 경우도 마찬가지입니다. 그러나 실제로는 하나 또는 다른 구현에 대한 구현을 개발하는 것이 어려울 수 있으며, 특히 반복 성공 패턴에 따른 확률적 구현의 경우 특히 그렇습니다. 이러한 이유로 Q# 각 functor에 대한 지원을 개별적으로 선언할 수 있습니다. 그러나 두 functor가 통근하므로 두 가지 모두에 대한 지원을 정의하는 연산에는 두 functor가 작업에 적용될 때 구현(일반적으로 암시적으로 정의됨, 즉 컴파일러 생성을 의미)이 있어야 합니다.
함수에 적용할 수 있는 펀터가 없습니다. 함수에는 현재 정확히 하나의 본문 구현이 있으며 더 이상 특수화되지 않습니다. 예를 들어 선언
function Hello (name : String) : String {
$"Hello, {name}!"
}
에 해당합니다.
function Hello (name : String) : String {
body ... {
$"Hello, {name}!"
}
}
여기서 body 지정된 구현이 함수 Hello기본 본문에 적용되도록 지정합니다. 즉, 호출 전에 functor 또는 다른 팩터리 메커니즘이 적용되지 않은 경우 구현이 호출됩니다.
body ... 세 개의 점은 함수 선언의 인수 항목을 복사하여 이 지점에 붙여넣어야 함을 나타내는 컴파일러 지시문에 해당합니다.
부모 호출 가능 선언의 인수를 복사하고 붙여넣을 위치를 명시적으로 나타내는 이유는 두 가지입니다. 하나는 인수 선언을 반복할 필요가 없으며, 두 가지는 Controlled functor와 같은 추가 인수가 필요한 functor를 일관된 방식으로 도입할 수 있도록 합니다.
기본 본문의 구현을 정의하는 특수화가 정확히 하나 있는 경우 양식 body ... { <implementation> } 추가 래핑을 생략할 수 있습니다.
재귀
Q# 호출 가능 개체는 직접 또는 간접적으로 재귀적일 수 있으며 어떤 순서로든 선언할 수 있습니다. 작업 또는 함수가 자신을 호출하거나 직접 또는 간접적으로 호출자를 호출하는 다른 호출 가능을 호출할 수 있습니다.
양자 하드웨어에서 실행할 때 스택 공간이 제한될 수 있으며, 스택 공간 제한을 초과하는 재귀로 인해 런타임 오류가 발생할 수 있습니다.