2011-04-12 52 views
5

是否可以在本地限制模塊的導入,最好是將其與Module Abbreviations相結合?目標是避免使用導入符號污染我當前的模塊。如何限制F#中模塊的導入到本地範圍?

例如(受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的)。 您可以在模塊使用縮寫,但只有在全球範圍內:除了Microsoft.FSharp.Collections.Array的

module A = 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) 
+0

謝謝您的回答洛朗。使用數組只是一個隨心所欲的事情 - 但回想起來不幸的是 - 例子。我的目標是在一個有限範圍內打開一個任意的Module(或名稱空間)_only_,就像在一個「let綁定」中一樣。如果我的理解正確,這是(目前?)在F#中不可能? – 2011-04-12 12:19:09

+0

確實。我希望將來有可能。與此同時,我認爲在全球範圍內添加一些縮寫並不會污染太多(但要儘量避免使用1個字符的名稱)。 – Laurent 2011-04-12 12:23:03

+0

好的謝謝,讓我們期待未來:) – 2011-04-12 14:00:44