如何在 Q# 中创建新类型操作?

How to create a newtype operation in Q#?

我正在使用 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.

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

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

之类的操作

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

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

然后无论你想在哪里使用它,你都可以直接使用命名项目 Apply 像这样:GroverMaxMatchingOracle::Apply(...)

如果有用的话,书中有一节关于用户定义类型 (8.2) @cgranade and I are working on, Learn Quantum Computing with Python and Q#