我刚刚开始学习F#(之前几乎没有.NET经验),请原谅我这可能是一个非常简单的问题:F#中命名空间和模块的区别是什么?
由于
戴夫
编辑:感谢Brian的回答。这就是我想知道的。 只是澄清:您是否也可以打开命名空间(类似于C#using语句)?
答案 0 :(得分:86)
命名空间是一种.Net的东西,在许多工业级语言中很常见,只是一种组织框架并避免不同库之间命名冲突的方法。您和我都可以定义类型“Foo”并在项目中使用它们,只要它们位于不同的名称空间(例如NS1.Foo和NS2.Foo)。 .Net中的命名空间包含类型。
模块是F#的东西,它大致类似于“静态类”......它是一个可以保存let-bound值和函数的实体,以及类型(请注意,名称空间不能直接包含值/函数,名称空间只能包含类型,它们本身可以包含值和函数)。模块内部的东西可以通过“ModuleName.Thing”引用,这与命名空间的语法相同,但F#中的模块也可以“打开”以允许不合格的访问,例如。
open ModuleName
...
Thing // rather than ModuleName.Thing
(编辑:命名空间也可以类似地打开,但模块可以包含值和函数的事实使得打开模块更“有趣”,因为你可以结束值和函数,例如“cos”,作为名称您可以直接使用,而在其他.Net语言中,您通常必须对其进行限定,例如“Math.cos”)。
如果您在F#中的“顶层”输入代码,则此代码隐含在模块中。
希望有所帮助,这是一个非常开放的问题。 :)