命名空间和F#中的模块有什么区别?

我刚刚开始学习F#(之前对.NET没有多less经验),所以原谅我可能是一个非常简单的问题:F#中的命名空间和模块之间的区别是什么?

谢谢

戴夫

编辑:感谢您的答案布赖恩。 这就是我想知道的。 只是澄清:你也可以打开一个命名空间(类似于C#使用语句)?

命名空间是一个.Net的东西,在许多工业强度的语言中很常见,只是一种组织框架并避免不同库之间的命名冲突的方法。 你和我都可以定义一个types“Foo”,并在项目中使用它们,只要它们位于不同的名称空间中(例如NS1.Foo和NS2.Foo)。 .Net中的命名空间包含types。

一个模块是一个F#的东西,它大致类似于一个“静态类”…它是一个实体,可以容纳允许值和函数,以及types(注意名称空间不能直接包含值/函数,命名空间只能包含types,它们本身可以包含值和函数)。 模块内部的东西可以通过“ModuleName.Thing”来引用,这与命名空间的语法相同,但是F#中的模块也可以被“打开”以允许不合格的访问,例如

open ModuleName ... Thing // rather than ModuleName.Thing 

(编辑:命名空间也可以类似地打开,但模块可以包含值和函数的事实使得打开一个模块更“有趣”,因为你可以结束值和function,例如“COS”,你可以使用的名称直接,而在其他.Net语言,你通常必须总是有资格,例如“Math.cos”)。

如果你在F#中的顶层input代码,这个代码隐式地进入一个模块。

希望有所帮助,这是一个相当开放的问题。 🙂