【问题标题】:How to create a newtype operation in Q#?如何在 Q# 中创建新类型操作?
【发布时间】:2020-01-17 10:11:49
【问题描述】:

我正在使用 Q# 进行通用 grover 搜索实现,我想定义一个自定义 Oracle 类型

    newtype ModelOracle = ((Qubit[], Qubit[], Int[], Qubit) => Unit);

    // ...

    function GroverMaxMatchingOracle(search_set: (Int,Int)[], vertices: Int[], marked_pts: Bool[]): ModelOracle {
        return ModelOracle(ApplyMaxMatchingOracle(_,_,_,_,search_set, vertices, marked_pts));
    }

这将适合我的模型。但是当我尝试使用它时(与他们在 DatabaseSearch 示例中使用 StateOracle 的方式相同),我收到一条错误消息,指出新类型 ModelOracle 不是有效操作

fail: Microsoft.Quantum.IQSharp.Workspace[0]
  QS5021: The type of the expression must be a function or operation type. The given expression is of type OracleHelper.ModelOracle.

我对这里的类型有什么误解?

【问题讨论】:

  • 您还需要共享 ApplyMaxMatchingOracle 的签名,否则很难重现错误。

标签: q#


【解决方案1】:

看起来你已经定义好了,所以你可能必须先用 ! 运算符解开用户定义的类型。 因此,在您使用它的地方,您可能需要执行GroverMaxMatchingOracle!(...)

之类的操作

另一种方法是在 UDT 中命名元组:

newtype ModelOracle = (Apply: (Qubit[], Qubit[], Int[], Qubit) => Unit);

然后无论你想在哪里使用它都可以直接使用命名项Apply,如下所示:GroverMaxMatchingOracle::Apply(...)

如果有帮助,@cgranade 一书中有一个关于用户定义类型 (8.2) 的部分,我正在努力,Learn Quantum Computing with Python and Q#

【讨论】:

  • 谢谢!这解决了我的问题。所以我从中得到的是 UDT(操作也是)总是只是一个包含值的元组?
  • 另外:您在操作签名周围缺少一对括号。编译器只是抱怨;)
猜你喜欢
  • 2013-05-10
  • 1970-01-01
  • 2013-12-01
  • 2019-02-19
  • 2015-08-12
  • 2020-06-16
  • 2014-09-13
  • 1970-01-01
相关资源
最近更新 更多