如何限制将F#中的Module导入本地范围?

Ale*_*sti 6 f# scope namespaces module

是否可以在本地限制模块的导入,最好将其与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)
Run Code Online (Sandbox Code Playgroud)

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

Lau*_*ent 1

目标是避免导入的符号污染我当前的模块。

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

module A = Microsoft.FSharp.Collections.Array
Run Code Online (Sandbox Code Playgroud)

您可以使用 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
Run Code Online (Sandbox Code Playgroud)

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

let elementsGreaterThan n =
    [1..100] |> Seq.filter (fun x -> x > n)
Run Code Online (Sandbox Code Playgroud)