Woj*_*Gac 6 c# anonymous-function quantum-computing q#
我在Q#中有一个用例,其中有一个量子位寄存器qs,需要将CNOT除第一个量子位之外的每个量子位都应用门,并使用第一个作为控制。使用for循环,我可以做到以下几点:
for (i in 1..Length(qs)-1) {
CNOT(qs[0], qs[i]);
}
Run Code Online (Sandbox Code Playgroud)
现在,我想给它一个更实用的味道,并尝试做类似的事情:
ApplyToEach(q => CNOT(qs[0], q), qs[1..Length(qs)-1]);
Run Code Online (Sandbox Code Playgroud)
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));
Run Code Online (Sandbox Code Playgroud)
此处,由于CNOT具有 type (Qubit, Qubit) => Unit is Adj + Ctl,因此填充两个输入之一作为CNOT(Head(qs), _)type 操作的结果Qubit => Unit is Adj + Ctl。
部分应用程序是一个非常强大的功能,整个 Q# 标准库都使用它来提供构建量子程序的功能方法。如果您有兴趣了解更多信息,我建议您查看https://learn.microsoft.com/quantum/language/expressions#callable-invocation-expressions上的文档。