2010-03-01 13 views
25

Conozco otherquestions sobre módulos y espacios de nombres en F #, pero no me están ayudando en este momento.F #, espacios de nombres, módulos, fs y fsx

Tengo un proyecto con

Utilities.fs

namespace Company.Project.Namespace 
module Utilities = 
    //stuff here 

Functions.fs

namespace Company.Project.Namespace 
open Utilities 

module Functions = 
    //stuff here 

y estoy tratando de probarlos en una FSX :

#load "Utilities.fs" 
#load "Functions.fs" 

que me da error FS0039: The namespace or module 'Utilities' is not defined cuando intento enviarlo a FSI con Alt-Enter.

He intentado agregar el mismo espacio de nombres en la parte superior del archivo de comandos, pero no me gusta.

Lo que es extraño es que el compilador de fondo no me grita.

Esto parece funcionar, pero ¿es el enfoque correcto?

#load "Utilities.fs" 
open Company.Project.Namespace 
#load "Functions.fs" 

¿Existe un proyecto de 'referencia' FSharp en alguna parte, que contiene ejemplos de cómo integrar todas estas cosas: espacios de nombres, módulos, clases, archivos de script, pruebas, etc.?

Respuesta

8

No soy un experto con FSI, pero algunos experimentos sugieren que los espacios de nombres solo son compatibles con declaraciones #load (no a través de interacciones típicas: enviar un grupo de declaración de espacio de nombres a VFSI mediante Alt-Enter no funciona) y eso las interacciones contribuyen diferentes 'instancias'. Por ejemplo, con el archivo de código

namespace Foo 

type Bar() = 
    member this.Qux() = printfn "hi" 

namespace Other 

type Whatever() = class end 

namespace Foo 

module M = 
    let bar = new Bar() 
    bar.Qux() 

si #load que más de una vez que consigo por ejemplo,

> [Loading C:\Program.fs] 
hi 

namespace FSI_0002.Foo 
    type Bar = 
    class 
     new : unit -> Bar 
     member Qux : unit -> unit 
    end 
namespace FSI_0002.Other 
    type Whatever = 
    class 
     new : unit -> Whatever 
    end 
namespace FSI_0002.Foo 
    val bar : Bar 

> #load @"C:\Program.fs";; 
> [Loading C:\Program.fs] 
hi 

namespace FSI_0003.Foo 
    type Bar = 
    class 
     new : unit -> Bar 
     member Qux : unit -> unit 
    end 
namespace FSI_0003.Other 
    type Whatever = 
    class 
     new : unit -> Whatever 
    end 
namespace FSI_0003.Foo 
    val bar : Bar 

> new Foo.Bar();; 
> val it : Foo.Bar = FSI_0003.Foo.Bar 

Tenga en cuenta que parece que el FSI_0003.Foo.Bar sombreó la versión FSI_0002.

Así que estoy pensando en la parte de la F # especificación que dice

Dentro de un grupo de declaración de espacio, el espacio de nombres en sí es implícitamente abierto si hay algún espacio de nombres grupos de declaración anteriores o referenciados asambleas contribuyen a este espacio de nombres, por ejemplo

namespace MyCompany.MyLibrary 

    module Values1 = 
     let x = 1 

namespace MyCompany.MyLibrary 

    // Implicit open of MyCompany.MyLibrary bringing Values1 into scope 

    module Values2 = 
     let x = Values1.x 

Sin embargo esto sólo se abre el espacio de nombres en su composición anterior por espacio de nombres grupos de declaración.

No interactúa con FSI, teniendo en cuenta la limitada comprensión de los espacios de nombres de FSI. Específicamente, espero que se abra la 'segunda # carga' de su ejemplo, p. FSI_000N+1 de la versión del espacio de nombres, mientras que el código anterior estaba en FSI_000N.Que tal vez, explica por qué la interacción explícita open lo corrige; llevas las cosas FSI_000N existentes sin sombra al nivel superior antes de intentar (implícitamente) referenciarlas más tarde.

+3

Sí, sucede que mi pregunta era un ejemplo diluido de mi código real. Terminé haciendo que funcione al volver a abrir el espacio de nombres entre cada # carga ... – Benjol

7

soy relativamente nuevo en esto también, pero esto es lo que funciona para mí cuando estoy probando en un archivo de FSX:

#if INTERACTIVE 
#r @"C:\Program Files\FSharpPowerPack-2.0.0.0\bin\FParsec.dll" 
#r @"C:\Program Files\FSharpPowerPack-2.0.0.0\bin\FParsecCS.dll" 
#endif 

open FParsec.Primitives 
open FParsec.CharParsers 

seguido por el código que utiliza estas bibliotecas.

+0

Creo que el cambio del orden de esos dll, no funciona – nicolas