c# - 我可以在 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 或消除我的错误信念?
解决方案
目前,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上的文档。
推荐阅读
- webview - 是否可以在浏览器堆栈设备中使用 appium 运行 webview 自动化脚本
- java - 有没有办法在 morphia 中编写否定查询( ex nand , nor , not )
- elasticsearch - 如何使用 Painless 拒绝弹性搜索索引结果中的 json 数据类型列中的值?
- node.js - 使用 PDFKit 在 S3 中即时存储 PDF
- node.js - 为什么这个猫鼬代码没有控制台日志?
- asp.net-mvc - 传递给 Dictionary 的模型是一种类型,而 Dictionary 需要 ViewModels 类型的模型项
- javascript - 具有两个操作的侧栏菜单,在同一窗口或新窗口中打开
- azure-functions - 我们可以更新 Azure 函数的所有实例中的对象吗?
- matlab - 田口 OA 是否有 2 个水平的 4 个因子的 matlab 函数?
- excel - Excel VBA 检查和比较工作簿之间的日期