有没有办法在F#中导入(打开)特定功能?

时间:2015-10-01 16:12:26

标签: f#

有没有办法在另一个模块中打开特定功能,而不是导入整个模块?类似的东西:

open TestFuncs with [myTestFuncInOtherModule]

3 个答案:

答案 0 :(得分:5)

正如您所见in the docsif let registerVC = self.storyboard?.instantiateViewControllerWithIdentifier("RegistrationViewControllerIdentifier") as? RegistrationViewController { UIView.animateWithDuration(0.0, animations: { if let view = self.navigationController?.view { self.navigationController?.pushViewController(registerVC, animated: false) UIView.setAnimationTransition(UIViewAnimationTransition.None, forView:view , cache: false) } }, completion: { (value: Bool) in }) } 关键字实际上并未加载模块或命名空间。它只允许您引用该模块/命名空间中的元素,而无需引用它们的完全限定名称。

这样,当你使用open时,你只是简单地调用该模块中的函数,而不是实际导入/加载它们在内存中,所以这个问题的简短答案就是使用open关键字,您只能对一个函数执行此操作。

您可以使用open绑定轻松实现相同的目标,但是:

let

答案 1 :(得分:3)

目前无法实现,但实际上put in a request已添加到该语言中。如果你想在F#4.0中看到这个添加,你可以做的一件事就是为该请求投票。

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

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

这使您无需在每次要引用其内容时都键入整个模块名称,但是您可以保持对命名空间的控制:这样,当您将模块更新为a时,不会发生意外名称冲突的可能性新版本,它增加了新名称。

答案 2 :(得分:1)

您可以使用完整的函数名称ModuleName.funcName来引用另一个模块中的特定函数:

module One =
    let square x = x * x

module Two =
    let anothersquare x = One.square x