我可以在 Q# 中使用 lambda 来对量子位进行操作吗?

Can I use lambda in Q# to operate on qubits?

我在 Q# 中有一个用例,其中我有量子位寄存器 qs 并且需要在除第一个之外的每个量子位上应用 CNOT 门,使用第一个作为控制。使用 for 循环我可以按如下方式进行:

for (i in 1..Length(qs)-1) {
    CNOT(qs[0], qs[i]);
}

现在,我想给它一个更实用的风格,并尝试做类似的事情:

ApplyToEach(q => CNOT(qs[0], q), qs[1..Length(qs)-1]);

Q# 编译器不接受这样的表达式,通知我它遇到了意外的代码片段。这对我的口味来说不是太有用。一些文档声称 Q# 支持匿名函数 a'la C#,因此进行了上述尝试。谁能指出我在 Q# 中正确使用 lambda 或消除我的错误信念?

目前,Q# 不支持 lambda 函数和操作(尽管这将是一个很好的功能请求,可以在 https://github.com/microsoft/qsharp-compiler/issues/new/choose 上提交)。也就是说,您可以通过使用部分应用程序获得从 lambda 获得的许多功能风格。例如,在您的示例中,我也可以将 for 循环写为:

 ApplyToEach(CNOT(Head(qs), _), Rest(qs));

此处,由于 CNOT 的类型为 (Qubit, Qubit) => Unit is Adj + Ctl,因此将两个输入之一填充为 CNOT(Head(qs), _) 会导致类型为 Qubit => Unit is Adj + Ctl 的操作。

部分应用程序是一个非常强大的功能,整个 Q# 标准库都使用它来提供构建量子程序的功能性方法。如果您有兴趣了解更多信息,我建议您查看 https://docs.microsoft.com/quantum/language/expressions#callable-invocation-expressions 上的文档。