如何将 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# 中的模块导入限制在本地范围内?的主要内容,如果未能解决你的问题,请参考以下文章