2015-10-01 99 views

回答

1

可以使用完整的函数名ModuleName.funcName指特定的功能,另一个模块:

module One = 
    let square x = x * x 

module Two = 
    let anothersquare x = One.square x 
4

正如你可以看到in the docs,该open关键字不实际加载的模块或命名空间。它只是允许您引用该模块/名称空间中的元素,而不用引用其完全限定的名称。

因此,当您使用open时,您只是更容易调用该模块中的函数,而不是实际地将它们导入/加载到内存中,所以此问题的简短答案是使用open关键字可以这不仅仅是为了一个功能。

您可以用let结合轻松实现同样的事情,虽然:

let f = TestFuncs.myTestFuncInOtherModule 
2

这不是当前可能的,但实际上我put in a request已为此要添加的语言。如果你想在F#4.0中看到这一点,你可以做的一件事就是为这个请求投票。

另一个很好的解决方法是,尚未被其他答案提及,是“伪打开”模块:为要使用其内容的模块分配一个简短名称。像这样:

module TP = Microsoft.FSharp.Data.TypeProviders 
type mySchema = TP.SqlDataConnection<"..."> 
let db = mySchema.GetDataContext() 

这使您不必要引用其内容每次键入完整的模块名称的便利的同时,您维护您的命名空间的控制:这种方式有没有意外的名称冲突的机会当您将模块更新为新版本并添加新名称时。

+0

啊。这也是一个不错的主意。这就像Elixir的别名。 – Korbin

相关问题