f# namespaces module projects-and-solutions f#-interactive

F#, espacios de nombres, módulos, fs y fsx



namespaces module (2)

No soy un experto en FSI, pero algunos experimentos sugieren que los espacios de nombres solo son compatibles con #load declaraciones de #load (no a través de interacciones típicas: el envío de un grupo de declaración de espacio de nombres a VFSI a través de Alt-Enter no funciona), y que diferentes interacciones contribuyen de manera diferente ''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 lo #load más de una vez me sale 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 FSI_0003.Foo.Bar siguió la versión de FSI_0002.

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

Dentro de un grupo de declaración de espacio de nombres, el propio espacio de nombres se abre implícitamente si alguno de los grupos de declaraciones de espacios de nombres anteriores o los ensamblajes a los que se hace referencia 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 solo abre el espacio de nombres tal como está constituido por los grupos de declaración de espacios de nombres anteriores.

No interactúa con FSI, dada la comprensión limitada de FSI de los espacios de nombres. Específicamente, espero que la ''segunda # carga'' de su ejemplo se abra, por ejemplo, la versión del espacio de nombres de FSI_000N+1 , mientras que el código anterior estaba en FSI_000N . Lo que tal vez explica por qué la interacción open explícita lo arregla; lleva el material FSI_000N sombreado FSI_000N hasta el nivel superior antes de intentar (implícitamente) referenciarlo más tarde.

Soy consciente de other questions sobre módulos y espacios de nombres en F #, pero no me están ayudando en este momento.

Tengo un proyecto con

Utilities.fs

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

Funciones.fs

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

Y estoy tratando de probarlos en un fsx:

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

lo que me da el 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 script, pero no me gusta eso.

Lo 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"

¿Hay algún proyecto FSharp de ''referencia'' en algún lugar, que contenga ejemplos de cómo integrar todo esto: espacios de nombres, módulos, clases, archivos de script, pruebas, etc.?


También soy relativamente nuevo en esto, pero esto es lo que me funciona cuando estoy probando en un archivo 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 de mi código que utiliza estas bibliotecas.