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.