2009-04-27 15 views
20

क्या फाइलों में एक एफ # मॉड्यूल को विभाजित करना संभव है?एकाधिक फ़ाइलों में विभाजित एफ # मॉड्यूल

पुस्तक मैं यह है, लेकिन पुस्तक शायद पुरानी (एफ # की नींव)

+1

यह सवाल, भ्रामक स्पष्ट नहीं है और http://stackoverflow.com/questions के एक dup/172888/f-defining-and-use-a-type-module-in-another-file-in-the-same-project जिसमें बेहतर उत्तर हैं। आईएमओ है कि ... –

उत्तर

11

जाहिर है नहीं है के अनुसार:

C:\temp\Tim>type 1.fs 2.fs 

1.fs 


#light 
module Module 

let sayHello1 = printfn "Hello, " 

2.fs 


#light 
module Module 

let sayHello2 = printfn "world!" 

C:\temp\Tim>fsc 1.fs 2.fs 
Microsoft F# Compiler, (c) Microsoft Corporation, All Rights Reserved 
F# Version 1.9.6.2, compiling for .NET Framework Version v2.0.50727 

2.fs(2,1): error FS0191: An implementation of the file or module Module has already been given. 

अद्यतन: त्रुटि एफ # 4.0 में बदल गया है यह, अब है:

त्रुटि FS0248: 'मॉड्यूल' नाम दो मॉड्यूल इस विधानसभा के दो भागों में पाए जाते

जहां Module नामस्थान भाग सहित आपकी असेंबली का पूर्णतः योग्य नाम है।

+2

यह बुरा है, क्योंकि मैं डेटा पार्सिंग कर रहा हूं और कई अलग-अलग डेटा संरचनाएं हैं इसलिए मैं बहुत बहुत लंबी F # फ़ाइल उत्पन्न कर रहा हूं ... – TimothyP

+0

इसे नियमित रूप से .NET में तोड़ने का समय मॉड्यूल के बजाय कक्षाएं? या एक से अधिक एफ # मॉड्यूल? –

+3

दुर्भाग्य से F # आंशिक कक्षाओं का समर्थन नहीं करता है, इसलिए आप कई स्रोत फ़ाइलों पर एक नियमित .NET कक्षा को भी विभाजित नहीं कर सकते हैं। –

3

मैं कभी कभी कई स्थानों पर एक प्रकार विभाजित कर देते हैं:

module Foo 

type Partial = Bar | BarInt of int 

module Bar 

type Foo.Partial with 
    member x.Extend = 5 


let b = Foo.Bar.Extend 

जहां मॉड्यूल फू और बार अलग अलग फ़ाइलों में हैं।

4

तरह कर्ट कहते हैं, आप प्रकार के विस्तार के तरीकों में जोड़ सकते हैं, और इस तरह

// File1.fs 
namespace Foo 

type Mine() = 
    static member f1() =() 
तो

// File2.fs 
type Foo.Mine with 
    static member f2() =() 

Foo.Mine. // both f1 and f2 here 

चूंकि यह एक वर्ग और नहीं एक मॉड्यूल है, तो आप 'खुला करने की क्षमता खो देते हैं मेरा '(लेकिन अधिभार करने की क्षमता प्राप्त करें); इस प्रकार आप जो भी कर रहे हैं उसके आधार पर यह आपके लिए एक स्वीकार्य विकल्प हो सकता है या नहीं भी हो सकता है।

+0

यह File2.fs के भीतर Intellisense के लिए सच है, लेकिन जब आप प्रतिबिंब के माध्यम से प्रकार लोड करते हैं (उदाहरण के लिए, टाइपफ (Foo.Mine) .GetMethods(), f2 नहीं दिखाता है। टिप के लिए धन्यवाद, हालांकि! –

6

प्रकार एक्सटेंशन शांत हैं, और उम्मीद है कि वे आंतरिक फ़ाइल होने की अनुमति देंगे जबकि अभी भी आंतरिक हैं। यदि आप एक ही फ़ाइल में एक प्रकार का एक्सटेंशन करते हैं, तो यह एक वर्ग तक संकलित होता है, और एक्सटेंशन के पास निजी सदस्यों तक पहुंच होती है और इसी तरह। यदि आप इसे किसी अन्य फ़ाइल में करते हैं, तो यह केवल "वैकल्पिक" एक्सटेंशन है, जैसे सी # स्थिर विस्तार विधियां। (भले ही एफ # चश्मा अलग-अलग कहें।)

मुझे आश्चर्य होगा अगर यह किसी बिंदु पर संबोधित नहीं किया गया है, केवल डिजाइनर समर्थन के लिए। यदि आंतरिक प्रकार एक्सटेंशन असेंबली में कहीं भी हो सकते हैं, तो यह बहुत चिकना होगा।

एक अन्य विकल्प है, जो नहीं हो सकता है कि आप क्या चाहते हैं, यह करने के लिए ModuleSuffix झंडा, एक प्रकार और एक मॉड्यूल बनाने मॉड्यूल एक ही नाम फोन, और फिर जोड़ने के लिए है:

type Foo() = 
    static member Bar = 1 

[<CompilationRepresentationAttribute(CompilationRepresentationFlags.ModuleSuffix)>] 
module Foo = 
    let Baz = 2 

printfn "%d %d" Foo.Bar Foo.Baz 

यह प्रयोग किया जाता है एफ # पुस्तकालयों में, इसलिए मॉड्यूल में सहायक सामग्री के साथ-साथ उनके पास एक प्रकार की सूची या जो कुछ भी हो सकता है।

+2

यह साफ है एफ # के भीतर, लेकिन अगर मैं इन प्रकारों को प्रतिबिंब के माध्यम से बाहर से एक्सेस करना चाहता हूं, तो वे "फू" और "फू मॉड्यूल" प्रकार के रूप में आते हैं। स्वीकृत प्रतिक्रिया के आधार पर, दोनों को एक ही प्रकार में दिखाने के लिए कोई रास्ता नहीं है, है? –

1

मेरी परियोजनाओं में से एक लक्ष्य मॉड्यूल को अलग करने के लिए ऑपरेशन Cp और Rm फाइल करना था, लेकिन उपयोगकर्ता को दोनों कार्यों के लिए दो नामस्थान खोलने की आवश्यकता नहीं है।

open Xake.FileTasks 
... 
do! Cp "*/*.exe" "deploy/*.exe" 
do! Rm "*/*.exe" 

Here're मेरी मॉड्यूल:

namespace Xake.FileTasks 

[<AutoOpen>] 
module RmImpl = 
    let Rm filemask target = 
... 

और दूसरा:

namespace Xake.FileTasks 

[<AutoOpen>] 
module CpImpl = 
    let Cp filemask target = 
... 
संबंधित मुद्दे