큐비트 데이터 형식설명에 자세히 설명된 것처럼 양자 계산은 대상 양자 프로세서에서 기본적으로 지원되는 작업의 부작용 형태로 실행됩니다. 이들은, 사실, Q#유일한 부작용. 모든 형식은 변경할 수 없는 있으므로 Q#명시적으로 표현되는 값에 영향을 주는 부작용은 없습니다. 따라서 특정 호출 가능 개체의 구현이 이러한 고유하게 구현된 작업을 직접 또는 간접적으로 호출하지 않는 한 해당 실행은 동일한 입력을 감안할 때 항상 동일한 출력을 생성합니다.
Q# 사용하면 이러한 순수한 결정적 계산을 함수로 명시적으로 분할할 수 있습니다. 기본적으로 지원되는 명령 집합은 언어 자체에 고정되고 기본 제공되는 것이 아니라 완전히 구성 가능하고 Q# 라이브러리로 표현되므로 함수가 다른 함수만 호출할 수 있고 작업을 호출할 수 없도록 요구하여 결정성이 보장됩니다. 또한 결정적이지 않은 네이티브 명령, 즉 양자 상태에 영향을 주므로 연산으로 표시됩니다. 이러한 두 가지 제한을 사용하면 입력 값이 알려진 즉시 함수를 평가할 수 있으며, 원칙에 따라 동일한 입력에 대해 두 번 이상 평가할 필요가 없습니다.
따라서 Q# 두 가지 유형의 호출 가능연산과 함수를 구분합니다. 모든 호출 가능 항목은 단일 인수(잠재적으로 튜플 값)를 입력으로 사용하고 단일 값(튜플)을 출력으로 생성합니다. 구문적으로 작업 형식은 <TIn> => <TOut> is <Char>표현됩니다. 여기서 <TIn> 인수 형식으로 대체되고, <TOut> 반환 형식으로 대체되고, <Char>작업 특성으로 바뀝니다. 특성을 지정할 필요가 없는 경우 구문은 <TIn> => <TOut>단순화합니다. 마찬가지로 함수 형식은 <TIn> -> <TOut>.
이 결정적 보장 외에도 작업과 함수 간에는 거의 차이가 없습니다. 둘 다 자유롭게 전달할 수 있는 일류 값입니다. 다음 예제와 같이 다른 호출 가능 개체에 대한 반환 값 또는 인수로 사용할 수 있습니다.
function Pow<'T>(op : 'T => Unit, pow : Int) : 'T => Unit {
return PowImpl(op, pow, _);
}
둘 다 형식 매개 변수화된 정의에 따라 인스턴스화할 수 있습니다. 예를 들어 형식 매개 변수화된 함수는 앞에서 Pow 예제의 return 문에서 수행한 것처럼 부분적으로 적용할 수 있습니다.
작업 특성
입력 및 출력 형식에 대한 정보 외에도 작업 유형에는 작업의 특성에 대한 정보가 포함됩니다. 예를 들어 이 정보는 작업에서 지원되는 펀터에 대해 설명합니다. 또한 내부 표현에는 컴파일러에서 유추하는 최적화 관련 정보도 포함됩니다.
작업의 특징은 미리 정의된 레이블 및 기본 제공 레이블 집합입니다. 형식 서명의 일부인 특수 식 형식으로 표현됩니다. 식은 미리 정의된 레이블 집합 중 하나 또는 지원되는 이진 연산자를 통한 특성 식의 조합으로 구성됩니다.
Adj 및 Ctl두 개의 미리 정의된 집합이 있습니다.
-
Adj작업이 인접할 수 있음을 나타내는 단일 레이블이 포함된 집합입니다. 즉,Adjointfunctor 지원하며 적용된 양자 변환은 "실행 취소"될 수 있습니다. 즉, 반전될 수 있습니다. -
Ctl작업이 제어 가능함을 나타내는 단일 레이블이 포함된 집합입니다. 즉,Controlledfunctor 지원하고 다른 큐비트의 상태에 따라 실행을 조건화할 수 있습니다.
특성 식의 일부로 지원되는 두 연산자는 집합 합집합 + 및 집합 교집합 *.
EBNF(확장 백러스-나우르 형식)
predefined = "Adj" | "Ctl";
characteristics = predefined
| "(", characteristics, ")"
| characteristics ("+"|"*") characteristics;
예상대로 *+ 것보다 우선 순위가 높으며 둘 다 왼쪽 결합적입니다. 예를 들어 단위 연산의 형식은 <TIn> => <TOut> is Adj + Ctl표현됩니다. 여기서 <TIn> 작업 인수의 형식으로 바꾸고 반환된 값의 형식으로 바꿔야 <TOut>.
메모
이 양식에서 작업의 특징을 나타내는 두 가지 주요 장점이 있습니다. 하나의 경우 레이블의 모든 조합에 대해 기하급수적으로 많은 언어 키워드를 사용하지 않고도 새 레이블을 도입할 수 있습니다. 더 중요한 것은 연산의 특성을 나타내는 식을 사용하여 향후 작업 특성에 대한 매개 변수화도 지원합니다.