Почему Q # не определяет ни пространство имен F #, ни C #? - PullRequest
1 голос
/ 22 октября 2019

Я делаю библиотеку в Q # и пытаюсь добавить ссылку на проект в библиотеку F # (или C #), написанную мной. Но это не работает.

После добавления соответствующей ссылки я проверил свой файл .csproj проекта Q # и увидел, что ссылка была добавлена ​​туда, что означает, что процесс добавления был выполнен правильно. Но когда я пытаюсь запустить код, я получаю это сообщение: «ошибка QS6104: пространство имен с таким именем не существует», которое относится к строке, включающей имя этой библиотеки F # (или C #). Интересно, почему это происходит? Это связано с некоторыми принципиальными различиями между Q # и F #, но Q # создается на основе F # и C #, поэтому есть какое-то решение для решения проблемы? Вот мой фрагмент кода:

    namespace MyQSharpLibrary
    {
        open Microsoft.Quantum.Canon;
        open Microsoft.Quantum.Intrinsic;
        open MyFSharpLib;
        ...
        ...
    }

MyFSharpLib - это библиотека, которую я определил в F #, и после добавления ссылки на нее внутри «MyQSharpLibrary» я вижу следующий код уценки в MyQSharpLibrary.csproj:

    <Project Sdk="Microsoft.NET.Sdk">
      ...
      ...
       <ItemGroup>
        <ProjectReference Include="..\MyFSharpLib\MyFSharpLib.fsproj"/>
       </ItemGroup>  
    </Project>

Но после запуска MyQSharpLibrary я получаю сообщение об ошибке: «ошибка QS6104: не существует пространства имен с таким именем», которое ссылается на строку, содержащую «open MyFSharpLib;»

1 Ответ

3 голосов
/ 22 октября 2019
Директивы

open в Q # позволяют импортировать только код Q #, но не код F # или C #. В общем случае Q # не позволяет выполнять произвольный классический код, поскольку он предназначен для выполнения на квантовом устройстве, которое в общем случае может не обладать такой способностью.


Если вы ищете обходной путь, который может быть выполнен в симуляции, но не будет переносимым на квантовое устройство, вы можете написать симулятор, который расширяет одно из существующих и предоставляет новые встроенные функции. функции в коде Q #, которые реализуют ваши классические вычисления.

Например, посмотрите, что делают Quantum Katas для сбора статистики о выполнении программы: они определяют CounterSimulator , который реализует встроенные функции, такие как GetOracleCallsCount, и соответствующий Q #код в Utils.qs , который предоставляет им код Q #. Затем этот проект добавляется в качестве зависимости к катам, которым требуется эта функциональность, например, DeutschJozsaAlgorithm - вы увидите ссылку на проект в файле DeutschJozsaAlgorithm.csproj и соответствующий open Quantum.Kata.Utils; in Tests.qs .

...