而不是导入一个完整的模块,有没有办法打开另一个模块中的特定功能?喜欢的东西:有没有办法在F#中导入(打开)特定函数?
open TestFuncs with [myTestFuncInOtherModule]
而不是导入一个完整的模块,有没有办法打开另一个模块中的特定功能?喜欢的东西:有没有办法在F#中导入(打开)特定函数?
open TestFuncs with [myTestFuncInOtherModule]
可以使用完整的函数名ModuleName.funcName
指特定的功能,另一个模块:
module One =
let square x = x * x
module Two =
let anothersquare x = One.square x
正如你可以看到in the docs,该open
关键字不实际加载的模块或命名空间。它只是允许您引用该模块/名称空间中的元素,而不用引用其完全限定的名称。
因此,当您使用open
时,您只是更容易调用该模块中的函数,而不是实际地将它们导入/加载到内存中,所以此问题的简短答案是使用open关键字可以这不仅仅是为了一个功能。
您可以用let
结合轻松实现同样的事情,虽然:
let f = TestFuncs.myTestFuncInOtherModule
这不是当前可能的,但实际上我put in a request已为此要添加的语言。如果你想在F#4.0中看到这一点,你可以做的一件事就是为这个请求投票。
另一个很好的解决方法是,尚未被其他答案提及,是“伪打开”模块:为要使用其内容的模块分配一个简短名称。像这样:
module TP = Microsoft.FSharp.Data.TypeProviders
type mySchema = TP.SqlDataConnection<"...">
let db = mySchema.GetDataContext()
这使您不必要引用其内容每次键入完整的模块名称的便利的同时,您维护您的命名空间的控制:这种方式有没有意外的名称冲突的机会当您将模块更新为新版本并添加新名称时。
啊。这也是一个不错的主意。这就像Elixir的别名。 – Korbin