【问题标题】:What the difference between a namespace and a module in F#?F# 中的命名空间和模块有什么区别?
【发布时间】:2009-04-27 20:33:07
【问题描述】:

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

谢谢

戴夫

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

【问题讨论】:

  • 还有一点需要注意,当你在 F# 中打开一个命名空间时,比如 System,你也可以访问它的子命名空间。所以在C#中,如果你打开System,你仍然需要写“System.IO.File”。在 F# 中,您可以编写“IO.File”。我发现这让代码变得更好。

标签: f# module namespaces


【解决方案1】:

命名空间是 .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# 中的“顶层”键入代码,则此代码会隐式进入模块中。

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

【讨论】:

  • 这不可能完全正确。模块也存在于 C# 中,不是吗?:stackoverflow.com/questions/645728/what-is-a-module-in-net
  • 嗯,有一个 netmodule,它是一个 .NET 的东西,还有一个 F# 模块,它是一个 F# 的东西,我认为 VB 可能有一个模块构造,并且类在一般的软件工程意义......但最初的问题是关于 F# 模块。
  • 有一个很棒的链接here,它解释了程序集和网络模块之间的关系 - 一个程序集可以包含用 2 种不同语言编写的 2 个网络模块。
  • 类似于 C# 6 中的“使用静态”
猜你喜欢
  • 2011-06-26
  • 2019-09-13
  • 2016-09-04
  • 1970-01-01
  • 2014-08-10
  • 2012-07-10
  • 1970-01-01
  • 2011-12-10
  • 2011-01-22
相关资源
最近更新 更多