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.?

Author: Community, 2010-03-01

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.

 9
Author: Brian,
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.

 8
Author: David White,
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