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


85

我刚刚开始学习F#(几乎没有使用.NET的经验),所以请原谅我一个很简单的问题:F#中的命名空间和模块之间的区别是什么?

谢谢

戴夫

编辑:感谢您的答案布莱恩。这就是我想知道的。只是澄清一下:您还可以打开一个名称空间吗(类似于C#using语句)?


4
还有一点需要注意的是,当您在F#中打开一个名称空间(如System)时,也可以访问其子名称空间。因此,在C#中,如果打开System,则仍然需要编写“ System.IO.File”。在F#中,您可以编写“ IO.File”。我发现这使代码更好。
MichaelGG

Answers:


93

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

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

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

(编辑:命名空间也可以类似地打开,但是模块可以包含值和函数的事实使得打开模块更加“有趣”,因为您可以使用值和函数(例如“ cos”)结束,可以使用它们作为名称直接,而在其他.Net语言中,您通常总是需要对其进行限定,例如“ Math.cos”)。

如果您在F#的“顶层”中键入代码,则此代码将隐式地放入模块中。

希望能有所帮助,这是一个很开放的问题。:)


那不是完全正确的。模块也存在于C#中,不是吗?: stackoverflow.com/questions/645728/what-is-a-module-in-net
Alexander Bird

1
好吧,有一个netmodule,这是一个.NET东西,还有一个F#模块,这是一个F#东西,我认为VB可能具有模块构造,而类在一般的软件工程意义上就是'模块'...但是最初的问题是关于F#模块的。
布莱恩(Brian)

1
有一个伟大的链接在这里,这也解释了组件和模块净值之间的关系-一个单一的组件可能包含2个netmodules写在2种不同的语言。
Darius

2
类似于C#6中的“使用静态”
Bruno Garcia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.