你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
复制和更新表达式
为了减少对可变绑定的需求,Q# 支持具有项目访问权限的值类型的复制和更新表达式。 用户定义类型和数组都是不可变的,属于此类别。 用户定义类型允许通过名称访问项,而数组则允许通过索引或索引范围访问项。
复制和更新表达式实例化一个新值,其中所有项都设置为原始表达式中的相应值,但某些指定项设置为表达式右侧定义的项除外。
它们使用三元运算符w/
<-
构造;语法w/
应读取为“with”的常用短表示法:
original w/ itemAccess <- modification
其中,original
是用户定义类型的表达式或数组表达式。 有关 itemAccess
和 modification
的相应要求,请参阅用户定义类型的复制和更新以及数组的复制和更新。
就优先级而言,copy-and-update 运算符是左关联运算符,优先级最低,特别是优先级低于范围运算符(..
)或三元条件运算符(?
|
)。
选择的左连结性允许复制和更新表达式的简单链接:
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
表示与原始值不同的项的名称。 这不仅仅是另一个表达式,例如 original
和 modification
,因为在没有任何进一步限定的情况下,简单使用项名称的能力仅限于此上下文;它是 Q# 中的两个上下文表达式之一。
modification
表达式的类型需要与另一命名项的类型相匹配。
例如,如果 complex
包含值 Complex(0., 0.)
,其中类型 Complex
在此处定义,则
complex w/ Re <- 1.
它为 Complex
类型的表达式,其计算结果为 Complex(1., 0.)
。
数组的复制和更新
对于数组,itemAccess
可以是合适类型的任意表达式;对数组切片有效的相同类型在此上下文中有效。 具体来说,itemAccess
表达式可以是 Int
或 Range
类型。 如果 itemAccess
是 Int
类型的值,则 modification
的类型必须与数组的项类型匹配。 如果 itemAccess
是 Range
类型的值,则 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