每次在Visual Studio 2015中的FSharp Interactive中加载FSX脚本文件(或任何其他文件)时,它都会打印一条消息:
> #load "D:ProjectsTests.fsx";;
[Loading D:ProjectsTests.fsx]
namespace FSI_0055
FSX是否为空、是否有一个或多个类型或模块并不重要。结果始终是加载消息(足够清晰),然后是namespace FSI_00XX
消息,其中XX是一个增量。也就是说,如果我再次运行上面的命令(无论是否更改文件),它都会显示:
> #load "D:ProjectsTests.fsx";;
[Loading D:ProjectsTests.fsx]
namespace FSI_0056
这看起来像是一个错误,但显然不是。我的猜测是,它是一个隐式名称空间,当前名称空间将设置为最新名称空间。这是否也意味着我可以使用以前的名称空间引用以前的版本?
或者,如果不是这样,它代表什么?
注意:如果我使用代码片段的"发送到交互式",则不会出现此消息。
对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