【问题标题】:What does "namespace FSI_00XX" mean in FSharp Interactive?FSharp Interactive 中的“命名空间 FSI_00XX”是什么意思?
【发布时间】:2015-11-17 04:13:21
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: f# visual-studio-2015 fsi


    【解决方案1】:

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

    【讨论】:

    • 谢谢,这是有道理的。至少这不是错误(这是我对消息的主要巴甫洛夫反应)。或许像 "Functions loaded in namespace FSI_XXXX" 这样的消息会更清楚一些。
    • 我认为不显示任何消息会很好 - 这只是 FSI 的一个实现细节,在实践中几乎不重要。
    猜你喜欢
    • 2013-09-29
    • 2012-01-21
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 2016-01-27
    • 2012-02-10
    • 2013-07-24
    • 1970-01-01
    相关资源
    最近更新 更多