“命名空间FSI_00XX”在FSharp Interactive中的含义是什么?

时间:2015-11-15 18:07:18

标签: f# visual-studio-2015 fsi

每次在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 个答案:

答案 0 :(得分: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