2010-03-01 104 views
25

我知道關於F#中的模塊和命名空間的otherquestions,但他們現在沒有幫助我。F#,命名空間,模塊,fs和fsx

我有與

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當我試圖把它與Alt-Enter發送到FSI。

我試着在腳本文件的頂部添加相同的命名空間,但它不喜歡這一點。

什麼奇怪的是,後臺編譯器不支持我喊。

這似乎工作,但它是正確的接近?

#load "Utilities.fs" 
open Company.Project.Namespace 
#load "Functions.fs" 

是否有一個「參考」 FSharp項目的地方,其中包含如何將所有這些東西整合的例子:類命名空間,模塊,腳本文件,測試等?

回答

8

我不是FSI的專家,但一些實驗表明,命名空間僅由#load聲明(不是通過典型的互動 - 通過發送一個命名空間聲明組VFSI Alt-Enter組合不起作用)的支持,以及不同互動貢獻不同的「實例」。例如,使用代碼文件

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材料帶到頂層。

+3

是的,碰巧,我的問題是一個淡化的實際代碼示例。我最終通過重新打開每個#load之間的名稱空間來使其工作... – Benjol 2010-03-01 20:27:23

7

我這個是比較新了,但是這是爲我工作,當我在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 

其次是我的代碼,使用這些庫。

+0

我認爲切換這些dll的順序不起作用 – nicolas 2012-07-02 13:48:23