Как ограничить импорт модуля в F # локальной областью? - PullRequest
5 голосов
/ 12 апреля 2011

Можно ли локально ограничить импорт модуля, предпочтительно сочетая его с 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 Ответ

1 голос
/ 12 апреля 2011

Цель состоит в том, чтобы не загрязнять мой текущий модуль с символами из импорт.

Обратите внимание, что open Array не допускается в F # (в отличие от OCaml). Вы можете использовать сокращения на модулях, но только в глобальном масштабе:

module A = Microsoft.FSharp.Collections.Array

Вместо Microsoft.FSharp.Collections.Array вы можете использовать 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)
...