2010-03-01 10 views
25

F # içindeki modüller ve ad alanları hakkında otherquestions'un farkındayım, ancak şu anda bana yardımcı değiller.F #, ad alanları, modüller, fs ve fsx

Ben

Utilities.fs

namespace Company.Project.Namespace 
module Utilities = 
    //stuff here 

Functions.fs

namespace Company.Project.Namespace 
open Utilities 

module Functions = 
    //stuff here 

ile bir proje var Ve ben bir FSX onları test çalışıyorum :

Alt-Enter ile FSI'ye göndermeye çalıştığımda bana verir.

Komut dosyasının en üstünde aynı ad alanını eklemeyi denedim, ancak bunu sevmiyor.

Arka plan derleyicisinin bana ses çıkarmaması garip bir durum.

Bu işe yarıyor gibi görünüyor, ancak doğru onaylama mı? ad alanlarını, modüller, sınıflar, komut dosyaları, vb testler:

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

bütün bunları nasıl entegre örnekler içerir yerde 'referans' Fsharp projesi var mı?

cevap

8

FSI konusunda uzman değilim, ancak bazı deneyler, ad alanlarının yalnızca #load bildirimleri tarafından desteklendiğini (tipik etkileşimlerle değil, Alt-Enter aracılığıyla VFSI'ya bir ad alanı bildirim grubu göndermenin işe yaramadığını) ve bunun farklı olduğunu gösterir. etkileşimler farklı 'örneklere' katkıda bulunur. Örneğin, kod dosyası

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() 

ile kendimi daha çok mesela bir kez daha bunu #load eğer o FSI_0003.Foo.Bar görünüyor ki

> [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 

Not FSI_0002 versiyonunu gölgeli. Önceki herhangi ad beyan grupları veya başvurulan montajlar katkıda eğer

yüzden açılmış örtülü

bir ad alanı bildirimi grup içinde

, ad kendisi diyor F # spec parçalardan biri olan düşündüklerim bu ad alanı, örn.

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 

Ancak bu sadece ad bildirimi grupları önceki oluşan olarak ad açılır.

FSI'nın sınırlı ad alanı anlayışına göre FSI ile etkileşime girmez. Spesifik olarak, örneğinizden 'ikinci #load' unun örn. FSI_000N+1 'un ad alanının sürümü, önceki kod ise FSI_000N idi.Hangi belki açık open etkileşimin bunu düzelttiğini açıklar; Daha sonra başvurmak için (örtülü olarak) göndermeden önce mevcut, gölgelenmemiş FSI_000N öğelerini en üst düzeye getirin.

+3

Evet, olduğu gibi, sorum benim gerçek kodumun sulandırılmış bir örneğiydi. Ben her #load ... – Benjol

7

Ben de bu nispeten yeniyim ama bu noktada bana bir FSX dosyasında test ediyorum zaman benim için çalışıyor şudur: Bu kitaplıklar kullanır benim koduyla

#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 

izledi.

+0

arasındaki isim alanını yeniden açarak işe almak için bitti Ben bu dll sırasını geçiş düşünüyorum, işe yaramıyor – nicolas