你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

运算和函数

量子比特数据类型的说明中详细说明的那样,量子计算以本机支持的对目标量子处理器的作的副作用的形式执行。 事实上,这些是 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 语句中所示。

作特征

除了有关输入和输出类型的信息外,作类型还包含有关作特征的信息。 例如,此信息描述了作支持哪些 functor。 此外,内部表示形式还包含编译器推断的优化相关信息。

作的特征是一组预定义的内置标签。 它们以属于类型签名的特殊表达式的形式表示。 该表达式由一组预定义的标签组成,或通过支持的二进制运算符组合特征表达式的组合。

有两个预定义集,AdjCtl

  • Adj 是包含一个标签的集,指示作是相邻的,这意味着它支持 Adjoint 函数,应用的量子转换可以“撤消”,也就是说,它可以反转。
  • Ctl 是包含单个标签的集,指示作是可控的,这意味着它支持 Controlled 函数,其执行可以取决于其他量子比特的状态。

作为特征表达式的一部分支持的两个运算符是集联合 + 和集交集 *。 在 EBNF 中(扩展后盾 –Naur 形式),

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

正如人们所期望的那样,* 的优先级高于 +,两者都是左关联。 例如,一元运算的类型表示为 <TIn> => <TOut> is Adj + Ctl,其中 <TIn> 应替换为作参数的类型,<TOut> 替换为返回值的类型。

注释

指示此窗体中作的特征具有两个主要优势:对于一个,可以引入新标签,而不对标签的所有组合使用指数级许多语言关键字。 更重要的是,使用表达式来指示作的特征也支持将来对作特征进行参数化。