F #

2010-02-19 12 views
16

में मॉड्यूल का प्रकार कैसे प्राप्त करें मॉड्यूल के 'सिस्टम टाइप' कैसे प्राप्त करें?F #

उदाहरण मॉड्यूल के लिए:

module Foo = 
    let bar = 1 

और यह काम नहीं करता है:

printfn "%s" typeof<Foo>.Name 

त्रुटि है:

The type 'Foo' is not defined 
+1

यहां जानबूझकर होना। आपको ऐसा करने की आवश्यकता क्यों होगी? आप मॉड्यूल का नाम जानते हैं, फू, और मुझे नहीं लगता कि एफ # में मॉड्यूल को मान के रूप में पास करने की क्षमता है। धन्यवाद। – nlucaroni

+0

आवश्यकता सरल है, मुझे कुछ स्वचालन की आवश्यकता है। मैं इसे प्रतिबिंब के साथ कर सकता हूं। PowerPack.Metadata मॉड्यूल के माध्यम से पुन: प्रयास करने की अनुमति देता है, लेकिन हो सकता है कि कुछ और आसान हो। –

+0

मुझे इसे लिखने वाली लाइब्रेरी में दृढ़ता से टाइप किए गए एपीआई के लिए भी ऐसा करने की ज़रूरत है। – justin

उत्तर

7

यह निश्चित रूप से एक moduleof ऑपरेटर के लिए अच्छा होगा .. चूंकि कोई नहीं है, इसलिए आप जो चाहते हैं उसे करने का सबसे आसान तरीका शायद मेटाडाटा लाइब्रेरी का उपयोग करना है एफ # पॉवर में:

#r "FSharp.PowerPack.Metadata.dll" 
open Microsoft.FSharp.Metadata 

// get .NET assembly by filename or other means 
let asm = ... 

let fasm = FSharpAssembly.FromAssembly asm 
let t = fasm.GetEntity("Foo").ReflectionType 

दुर्भाग्य से, यह (जैसे एफ # इंटरएक्टिव द्वारा उत्पन्न होते हैं) को गतिशील विधानसभाओं के साथ काम नहीं करेगा। आप वेनिला System.Reflection कॉल का उपयोग करके कुछ ऐसा कर सकते हैं, लेकिन यह आपके मॉड्यूल द्वारा संकलित संकलित रूप की अच्छी समझ रखने पर अधिक निर्भर है।

+0

मुख्य समस्या यह है कि 'FSharpAssembly.FromAssembly asm' सभी प्रकारों को लोड करता है। टाइप सुरक्षा भी कम करें। –

+0

@ माइक - मुझे यकीन नहीं है कि "टाइप प्रकार सुरक्षा" से आपका क्या मतलब है ... मॉड्यूल का उपयोग सामान्य प्रकार पैरामीटर के रूप में करने का कोई तरीका नहीं है, इसलिए आपको एक स्ट्रिंग का उपयोग करना होगा। यह दुर्भाग्यपूर्ण है, लेकिन अपरिहार्य है। – kvb

+3

क्या इसे अभी भी एक पावर पैक की आवश्यकता है या क्या 5 साल बाद बेहतर तरीका है? – Maslow

-1

मॉड्यूल नाम एक प्रकार नहीं है।

ListList.map और let (a:List<int>) = [1;2;3] अलग हैं।

पहला List एक मॉड्यूल नाम है, दूसरा एक प्रकार है।

+5

मैं 'FSharpType.IsModule (System.Type)' के बारे में चिंतित हूं, इसलिए मॉड्यूल आईएस प्रकार है, कम से कम सीएलआर शर्तों में। –

+1

स्थिर श्रेणी (प्रकार) का नाम जो 'सूची' मॉड्यूल को संकलित किया गया है शायद 'ListModule' है। –

26

आपने मॉड्यूल के लिए एक मार्कर प्रकार जोड़ सकते हैं और फिर उस से मॉड्यूल के प्रकार की खोज:

module Foo = 
    type internal Marker = interface end 
    let t = typeof<Marker>.DeclaringType 
5

यह भी Quotations का उपयोग किया जा सकता है। सबसे पहले, इस सहायक समारोह कहीं परिभाषित:

open Microsoft.FSharp.Quotations.Patterns 

let getModuleType = function 
| PropertyGet (_, propertyInfo, _) -> propertyInfo.DeclaringType 
| _ -> failwith "Expression is no property." 

उसके बाद, आप इस तरह एक मॉड्यूल को परिभाषित करने और अपने प्रकार प्राप्त कर सकते हैं:

module SomeName = 
    let rec private moduleType = getModuleType <@ moduleType @> 

आशा इस मदद करता है।

+0

यह इंटरैक्टिव में काम नहीं करता है, है ना? – BitTickler

+0

यह मेरे लिए करता है, हालांकि मैंने दूसरे भाग को संशोधित किया: 'मॉड्यूल SomeName = rec rec मॉड्यूल टाइप करें = getModuleType <@ मॉड्यूल टाइप @> ;;', फिर 'SomeName.moduleType ;;' प्रकार की जानकारी आउटपुट करना चाहिए। –

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

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