【问题标题】:Can I use lambda in Q# to operate on qubits?我可以在 Q# 中使用 lambda 来操作量子位吗?
【发布时间】:2020-01-13 05:58:15
【问题描述】:

我在 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 或消除我的错误信念?

【问题讨论】:

    标签: c# anonymous-function quantum-computing q#


    【解决方案1】:

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

    【讨论】:

    • 克里斯·格拉纳德,非常感谢您的回答。事实上,部分应用程序适合我迄今为止遇到的大多数用例。谢谢你提醒我它的存在:)。
    • 我创建了一个向 Q# 编译器添加匿名函数的功能请求 (here)。
    猜你喜欢
    • 2011-10-08
    • 1970-01-01
    • 2016-02-14
    • 2021-03-06
    • 2023-03-19
    • 1970-01-01
    • 2013-05-18
    • 2012-08-22
    • 2021-11-20
    相关资源
    最近更新 更多