F#, espacios de nombres, módulos, fs y fsx
Soy consciente de otros preguntas sobre módulos y espacios de nombres en F#, pero no me están ayudando en este momento.
Tengo un proyecto con
Utilidades.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"
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 script, pero no le gusta que.
Lo raro 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 un proyecto FSharp 'de referencia' en algún lugar, que contiene ejemplos de cómo integrar todo esto: espacios de nombres, módulos, clases, archivos de script, pruebas, etc.?
2 answers
No soy un experto en FSI, pero algunos experimentos sugieren que los espacios de nombres solo son compatibles con las declaraciones #load
(no a través de interacciones típicas - enviar un grupo de declaración de espacio de nombres a VFSI a través de Alt-Enter no funciona), y que las diferentes interacciones contribuyen con 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 lo #load
más de una vez obtengo, 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 el FSI_0003.Foo.Bar sombreó la versión FSI_0002.
So Estoy pensando en la parte de la especificación F# que dice
Dentro de un grupo de declaración de espacio de nombres, el espacio de nombres en sí es implícitamente abierto si cualquier espacio de nombres anterior grupos de declaración o referenciados las asambleas contribuyen a esto 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 constituido por el espacio de nombres precedente grupos de declaración.
No interactúa con FSI, dada la limitada comprensión de FSI de los espacios de nombres. Concretamente, Espero que el 'segundo # load' de tu ejemplo 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 explícita open
lo arregla; lleva las cosas existentes, sin sombrear FSI_000N
al nivel superior antes de intentar (implícitamente) referenciarlo más tarde.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-01 16:24:01
Soy relativamente nuevo en esto también, pero esto es lo que funciona para mí 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 usa estas bibliotecas.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-16 00:01:35