为什么 Q# 不检测 F# 或 C# 命名空间?

Why Q# does not detect either F# or C# namespace?

我正在用 Q# 创建一个库,并尝试添加对我编写的 F#(或 C#)库的项目引用。但是没用。

添加适当的引用后,我检查了我的 Q# 项目 .csproj 文件,我可以看到引用已添加到那里,这意味着添加过程已正确完成。但是,当我尝试 运行 代码时,我收到此消息: "error QS6104: No namespace with that name exists" 指的是包含该 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>

但是在 运行ning MyQSharpLibrary 之后,我收到错误消息: "error QS6104: No namespace with that name exists" 这是指包含 "open MyFSharpLib;"

的行
Q# 中的

open 指令仅允许您导入 Q# 代码,而不是 F# 或 C# 代码。 Q# 通常不允许执行任意经典代码,因为它被设计为在通常可能不具备此功能的量子设备上执行。


如果您正在寻找一种可以在模拟中完成但不能移植到量子设备的解决方法,您可以编写一个模拟器来扩展现有的一个并向 Q# 公开新的内部函数实现经典计算的代码。

例如,看看 Quantum Katas 是如何收集有关程序执行的统计数据的:它们定义了 CounterSimulator which implements intrinsic functions such as GetOracleCallsCount, and a matching Q# code in Utils.qs which exposes them to Q# code. Then this project is added as a dependency to the katas that need this functionality, for example, DeutschJozsaAlgorithm - you'll see the project reference in DeutschJozsaAlgorithm.csproj file and a matching open Quantum.Kata.Utils; in Tests.qs