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