2010-03-01 25 views
25

मुझे otherquestions के बारे में पता है 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 देता है जब मैं इसे Alt-Enter के साथ एफएसआई में भेजने की कोशिश करता हूं।

मैंने स्क्रिप्ट फ़ाइल के शीर्ष पर एक ही नामस्थान जोड़ने का प्रयास किया है, लेकिन यह पसंद नहीं है।

अजीब बात यह है कि पृष्ठभूमि कंपाइलर मुझ पर चिल्लाता नहीं है।

ऐसा लगता है, लेकिन यह सही दृष्टिकोण है? मॉड्यूल कक्षाएं,, परीक्षण आदि नामस्थान,, स्क्रिप्ट फ़ाइलें:

#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 संस्करण छाया।

तो मैं एफ # कल्पना है कि कहते हैं

एक नाम स्थान घोषणा समूह के भीतर, नाम स्थान का ही एक हिस्सा सोच रहा हूँ है परोक्ष खोला यदि कोई पूर्ववर्ती नाम स्थान घोषणा समूहों या संदर्भित विधानसभाओं के लिए योगदान यह नामस्थान, उदाहरण के लिए

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_000N+1 नामस्थान का संस्करण, जबकि पूर्व कोड FSI_000N में था।जो शायद बताता है कि क्यों स्पष्ट open इंटरैक्शन इसे ठीक करता है; आप इसे बाद में संदर्भित करने के लिए प्रयास करने से पहले मौजूदा, बिना छायांकित FSI_000N शीर्ष स्तर तक सामान लाते हैं।

+3

हाँ, जैसा कि होता है, मेरा प्रश्न मेरे वास्तविक कोड का एक पानी का उदाहरण था। मैं प्रत्येक #load ... – Benjol

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

के बीच नेमस्पेस को फिर से खोलकर काम करने के लिए इसे समाप्त कर रहा हूं, मुझे लगता है कि उन डीएल के क्रम को स्विच करना, काम नहीं करता है – nicolas

संबंधित मुद्दे