在F#中自动打开命名空间

时间:2012-03-03 14:38:00

标签: f# module namespaces

您想知道如何让f#编译器自动自动打开命名空间。

我有

namespace XXX 

I have to add something here do(AutoOpen("XXX.YYY")) or something like that to make the XXX.YYY module to be opened when referencing the library from external projects.

[<AutoOpen>]
module YYY = 
    ....

谢谢

2 个答案:

答案 0 :(得分:11)

要在不先打开其父级的情况下打开命名空间/模块,必须在程序集级别添加该属性。 您可以通过向项目添加AssemblyInfo.fs文件来执行此操作:

如果是以下代码:

namespace Framework

module GlobalFunctions = 

  let Test () =
    10.

您可以将以下代码添加到AssemblyInfo.fs:

namespace Framework

[<assembly:AutoOpen("Framework.GlobalFunctions")>]

do()

然后您可以使用以下命令从脚本(.fsx)文件调用代码

#r @"C:\PathToAssembly\Assembly.dll"

let result = Test ()

导致:

--> Referenced 'C:\PathToAssembly\Assembly.dll'
val result : float = 10.0

答案 1 :(得分:3)

AutoOpen属性只能应用于F#module,因此您无法将其添加到整个namespace。但是,由于您可以将所有F#声明放在模块中,这可能足以满足您的需要。语法是:

[<AutoOpen>]
module MyGlobals =
  // Declarations in the module
  type Foo() = 
    member x.Bar = 10

引用程序集时,应立即看到Foo。如果声明放在另一个名称空间(即MyLibrary)内,那么您需要添加open MyLibrary,但MyGlobals将自动访问。