"namespace FSI_00XX" 在 FSharp Interactive 中是什么意思?

What does "namespace FSI_00XX" mean in FSharp Interactive?

每次我在 Visual Studio 2015 年在 FSharp Interactive 中加载 FSX 脚本文件(或与此相关的任何其他文件)时,它都会打印一条消息:

> #load "D:\Projects\Tests.fsx";;
[Loading D:\Projects\Tests.fsx]

namespace FSI_0055

FSX 是否为空,是否包含一种或多种类型或模块并不重要。结果始终是加载消息(足够清楚),然后是 namespace FSI_00XX 消息,其中 XX 是递增数字。即,如果我再次 运行 上面的命令(有或没有更改文件),它会显示:

> #load "D:\Projects\Tests.fsx";;
[Loading D:\Projects\Tests.fsx]

namespace FSI_0056

看起来像是错误,但显然不是。我的猜测是,它是一个隐式命名空间,当前命名空间将被设置为最新的。这是否也意味着我可以使用以前的命名空间来引用以前的版本?

或者,如果不是,它代表什么?

注意:如果我使用代码段的 "Send to interactive",则此消息不会出现。

对 FSI 内部结构有更详细了解的人无疑可以为您提供更完整的答案,但就其价值而言:

  • FSI_XXXX 是一个动态创建的 F# 模块,其中包含您输入到 REPL 中的 "free" 定义,
  • "Sending into interactive" 实际上确实将定义放入这样的模块中,尽管没有像 "load" 情况下那样打印明确的消息,
  • 我无法明确地掌握 FSI_XXXX 类型,但可以使用反射来实现。 FSI 似乎不允许像 "FSI_0001.Test" 这样的东西作为对旧版本的引用 - 无法判断它是偶然的还是设计的。

检查下面的代码:

type Test = T of int

// this is the FSI_XXXX type, you can inspect it for more details.
let fsiType = typeof<Test>.DeclaringType 

Microsoft.FSharp.Reflection.FSharpType.IsModule fsiType // returns true

如果你 copy/paste 和 运行 在 Visual Studio 中的 FSI window 中,它将 return 如下所示:

type Test = | T of int
val fsiType : System.Type = FSI_0026
val it : bool = true