我知道other questions关于F#中的模块和命名空间,但他们现在没有帮助我。
我有一个项目
Utilities.fs
namespace Company.Project.Namespace
module Utilities =
//stuff here
Functions.fs
namespace Company.Project.Namespace
open Utilities
module Functions =
//stuff here
我正试图在fsx中测试它们:
#load "Utilities.fs"
#load "Functions.fs"
当我尝试使用error FS0039: The namespace or module 'Utilities' is not defined
将其发送给FSI时,会给我Alt-Enter
。
我尝试在脚本文件的顶部添加相同的命名空间,但它不喜欢这样。
奇怪的是后台编译器没有对我大喊大叫。
这似乎有效,但它是正确的approch?
#load "Utilities.fs"
open Company.Project.Namespace
#load "Functions.fs"
在某个地方是否有'参考'FSharp项目,其中包含如何集成所有这些内容的示例:命名空间,模块,类,脚本文件,测试等。
答案 0 :(得分:9)
我不是FSI的专家,但是一些实验表明命名空间只有#load
声明支持(不是通过典型的交互 - 通过Alt-Enter向VFSI发送命名空间声明组不起作用),并且不同的交互会产生不同的“实例”。例如,使用代码文件
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()
如果我#load
不止一次,我会得到这样的。
> [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
请注意,似乎FSI_0003.Foo.Bar影响了FSI_0002版本。
所以我正在考虑F#规范的一部分
在名称空间声明组中, 命名空间本身是隐含的 如果有任何前面的命名空 声明组或引用 集会对此有所贡献 名称空间
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
但是这只会打开命名空间 由前面的命名空间构成 宣言组。
鉴于FSI对命名空间的理解有限,不与FSI交互。具体来说,我希望您的示例中的“第二个#load”打开,例如FSI_000N+1
版本的命名空间,而先前的代码位于FSI_000N
。这可能解释了为什么明确的open
互动修复了它;在尝试(隐式)稍后引用它之前,你将现有的,没有阴影的FSI_000N
内容提升到顶层。
答案 1 :(得分:8)
我在这方面也比较新,但是当我在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
后面是我使用这些库的代码。