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

复制和更新表达式

为了减少对可变绑定的需求,Q# 支持具有项目访问权限的值类型的复制和更新表达式。 用户定义类型和数组都是不可变的,属于此类别。 用户定义类型允许通过名称访问项,而数组则允许通过索引或索引范围访问项。

复制和更新表达式实例化新值,其中所有项都设置为原始表达式中的相应值,但某些指定项除外,这些指定项设置为表达式右侧定义的项除外。 它们是使用三元运算符 w/<- 构造的;语法 w/ 应被理解为“with”的常用短记号:

    original w/ itemAccess <- modification

其中,original 是用户定义类型的表达式或数组表达式。 有关 itemAccessmodification 的相应要求,请参阅用户定义类型的复制和更新以及数组的复制和更新

就优先级而言,复制和更新运算符是左连结的并且具有最低优先级,尤其是低于范围运算符 (..) 或三元条件运算符 (?|) 的优先级。 选择的左连结性允许复制和更新表达式的简单链接:

    let model = Default<SequentialModel>()
        w/ Structure <- ClassifierStructure()
        w/ Parameters <- parameters
        w/ Bias <- bias;

与构造表达式(与所涉及的最左侧表达式具有相同类型)的任何运算符一样,可使用相应的求值和重新赋值语句。 例如,下面的两个语句实现以下目标:第一个语句声明一个可变变量 arr,并将其绑定到整数数组的默认值。 然后,第二条语句构建一个新数组,其中第一项(索引为 0)设置为 10,并将其重新分配给 arr

    mutable arr = [0, size = 3]; // arr contains [0, 0, 0]
    set arr w/= 0 <- 10;      // arr contains [10, 0, 0] 

第二个语句只不过是更详细的语法 set arr = arr w/ 0 <- 10; 的简写。

用户定义类型的复制和更新

如果值 original 是用户定义类型,则 itemAccess 表示与原始值不同的项的名称。 这不仅仅是另一个表达式,例如 originalmodification,因为在没有任何进一步限定的情况下,简单使用项名称的能力仅限于此上下文;它是 Q# 中的两个上下文表达式之一。

modification 表达式的类型需要与另一命名项的类型相匹配。 例如,如果 complex 包含值 Complex(0., 0.),其中类型 Complex此处定义,则

complex w/ Re <- 1. 

它为 Complex 类型的表达式,其计算结果为 Complex(1., 0.)

数组的复制和更新

对于数组,itemAccess 可以是合适类型的任意表达式;对数组切片有效的相同类型在此上下文中有效。 具体来说,itemAccess 表达式可以是 IntRange 类型。 如果 itemAccessInt 类型的值,则 modification 的类型必须与数组的项类型匹配。 如果 itemAccessRange 类型的值,则 modification 的类型必须与数组类型相同。

例如,如果 arr 包含数组 [0, 1, 2, 3],则

  • arr w/ 0 <- 10 是数组 [10, 1, 2, 3]
  • arr w/ 2 <- 10 是数组 [0, 1, 10, 3]
  • arr w/ 0..2..3 <- [10, 12] 是数组 [10, 1, 12, 3]

复制和更新表达式允许基于现有数组有效地创建新数组。 复制和更新表达式的实现通过只复制必要的部分以实现所需的行为,并在可能的情况下执行就地修改,从而避免复制整个数组。 因此,由于不可变性,数组初始化不会产生额外的开销。

Microsoft.Quantum.Arrays 命名空间提供了一系列用于数组创建和操作的便捷工具。

复制和更新表达式是动态构建新数组的便捷方式;例如,以下表达式的计算结果为一个数组,其中所有项都设置为 PauliI,但索引 i 处的项除外,它设置为 PauliZ

[PauliI, size = n] w/ i <- PauliZ