我在Q#中有一个用例,其中我有qubit寄存器qs
,需要将除第一个之外的每个qubit都应用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查阅文档。