FSI_00XX在FSharp Interactive中的含义是什么?

4
每次我在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

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

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

注意:如果我使用代码片段的“发送到交互式”功能,则不会出现此消息。

1个回答

3

有更详细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

如果您将以下代码复制/粘贴到 Visual Studio 的 FSI 窗口中并运行,它会返回类似下面的内容:
type Test = | T of int
val fsiType : System.Type = FSI_0026
val it : bool = true

谢谢,这很有道理。至少它不是错误(这是我对消息的主要条件反射)。也许像“函数加载到命名空间FSI_XXXX中”这样的消息会更清晰一些。 - Abel
我认为不显示任何消息应该是可以的 - 这只是FSI的实现细节,在实践中几乎没有什么影响。 - scrwtp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接