首页 > 解决方案 > 我可以在 Q# 中使用 lambda 对量子位进行操作吗?

问题描述

我在 Q# 中有一个用例,我有 qubit 寄存器qs,需要CNOT在除第一个之外的每个 qubit 上应用门,使用第一个作为控制。使用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 或消除我的错误信念?

标签: c#anonymous-functionquantum-computingq#

解决方案


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

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

在这里,由于CNOT有 type (Qubit, Qubit) => Unit is Adj + Ctl,因此将两个输入之一填充CNOT(Head(qs), _)为 type 的操作Qubit => Unit is Adj + Ctl

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


推荐阅读