Как создать операцию newtype в Q #? - PullRequest
1 голос
/ 17 января 2020

Я работаю с Q # над общей реализацией поиска c 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));
    }

, который будет соответствовать моей модели. Но когда я пытаюсь использовать его (вроде так же, как они используют StateOracle в образце DatabaseSearch), я получаю сообщение о том, что новый тип 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.

Что я ошибаюсь в типах здесь?

1 Ответ

1 голос
/ 17 января 2020

Похоже, что вы определили все в порядке, поэтому, возможно, вам придется сначала развернуть пользовательский тип с помощью оператора !. Поэтому, когда вы используете его, вам, возможно, придется сделать что-то вроде GroverMaxMatchingOracle!(...)

Другой подход может заключаться в названии кортежа в вашем UDT:

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

Затем везде, где вы хотите его использовать Вы можете напрямую использовать именованный элемент Apply следующим образом: GroverMaxMatchingOracle::Apply(...)

Если это полезно, в книге есть раздел о пользовательских типах (8.2) @ cgranade и я изучаем квантовые вычисления с Python и Q #

...