如何将 F# 中的模块导入限制在本地范围内?

Posted

技术标签:

【中文标题】如何将 F# 中的模块导入限制在本地范围内?【英文标题】:How to restrict the import of a Module in F# to a local scope? 【发布时间】:2011-08-03 18:28:55 【问题描述】:

是否可以在本地限制模块的导入,最好将其与Module Abbreviations 结合使用?目标是避免导入的符号污染我当前的模块。

例如(受 OCaml 启发)类似的东西:

let numOfEvenIntegersSquaredGreaterThan n =
    let module A = Microsoft.FSharp.Collections.Array in
        [|1..100|] |> A.filter (fun x -> x % 2 = 0)
                   |> A.map    (fun x -> x * x)
                   |> A.filter (fun x -> x > n)
                   |> A.length

let elementsGreaterThan n =
    let module A = Microsoft.FSharp.Collections.List in
        [1..100] |> A.filter (fun x -> x > n)

另外有没有办法用命名空间实现类似的东西?

【问题讨论】:

【参考方案1】:

我们的目标是避免污染我的 当前模块的符号来自 进口。

请注意,open Array 在 F# 中是不允许的(与 OCaml 相反)。 您可以在模块上使用缩写,但只能在全局范围内:

module A = Microsoft.FSharp.Collections.Array

您可以使用 Array 来代替 Microsoft.FSharp.Collections.Array。所以你的代码是:

let numOfEvenIntegersSquaredGreaterThan n =
    [|1..100|] |> Array.filter (fun x -> x % 2 = 0)
               |> Array.map    (fun x -> x * x)
               |> Array.filter (fun x -> x > n)
               |> Array.length

如果您想为数组和列表重用相同的代码,您可能需要使用Seq 模块:

let elementsGreaterThan n =
    [1..100] |> Seq.filter (fun x -> x > n)

【讨论】:

感谢您的回答洛朗。不过,使用 Array 只是一个随意的例子——回想起来是不幸的例子。我的目标是在有限的范围内打开任意模块(或命名空间)only,例如在单个“let 绑定”中。如果我理解正确,这(目前?)在 F# 中是不可能的? 确实如此。我希望将来有可能。同时,我认为在全局范围内添加一些缩写不会造成太大的污染(但尽量避免使用 1 字符名称)。

以上是关于如何将 F# 中的模块导入限制在本地范围内?的主要内容,如果未能解决你的问题,请参考以下文章

const,static,volatile

如何让我的 Python 模块在 Linux 系统范围内可用?

在 Lua 中如何导入模块?

python中模块的__all__属性

static关键字

python模块中的_all__属性的作用