2011-04-12 16 views
5

¿Es posible restringir localmente la importación de un módulo, preferiblemente combinando esto con Module Abbreviations? El objetivo es evitar contaminar mi módulo actual con símbolos de importaciones.¿Cómo restringir la importación de un Módulo en F # a un ámbito local?

p. Ej. (inspirado en OCaml) algo así:

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) 

Además, ¿hay alguna manera de lograr algo similar con espacios de nombres?

Respuesta

1

El objetivo es evitar contaminar mi módulo actual con símbolos de importaciones.

Tenga en cuenta que open Array no está permitido en F # (contrario a OCaml). Puede utilizar abreviaturas en los módulos, pero sólo en el ámbito global:

module A = Microsoft.FSharp.Collections.Array 

En lugar de Microsoft.FSharp.Collections.Array, puede utilizar la matriz. Así que el código sería:

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 

Si desea volver a utilizar el mismo código para matrices y listas, es posible que desee utilizar el módulo Seq:

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

Gracias por su respuesta Laurent. Sin embargo, usar Array fue solo un ejemplo arbitrario, y desafortunado en retrospectiva. Mi objetivo es abrir un Módulo (o espacio de nombres) arbitrario _ solo_ dentro de un alcance limitado, como dentro de un solo 'permitir el enlace'. Si te entiendo correctamente, ¿esto (¿actualmente?) No es posible en F #? –

+0

De hecho. Espero que sea posible en el futuro. Mientras tanto, creo que agregar algunas abreviaturas en el alcance global no contamina demasiado (pero trate de evitar nombres de 1 char). – Laurent

+0

ok gracias y esperemos por el futuro :) –

Cuestiones relacionadas