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

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

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

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

4

1 回答 1

3

对 FSI 内部有更详细了解的人无疑可以给你一个更完整的答案,但它的价值:

  • FSI_XXXX 是一个动态创建的 F# 模块,其中包含您输入到 REPL 中的“自由”定义,
  • “发送到交互式”实际上确实将定义放入这样的模块中,尽管没有像“加载”情况那样打印明确的消息,
  • 我无法明确获取 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
于 2015-11-16T09:17:22.873 回答