2013-02-21 57 views
6

एफ # इंटरएक्टिव (एफएसआई) में, आप इंटरैक्टिव सत्र में एक प्रकार के लिए सुंदर प्रिंटिंग प्रदान करने के लिए AddPrinter या AddPrinterTransformer का उपयोग कर सकते हैं। मैं सामान्य प्रकार के लिए ऐसा प्रिंटर कैसे जोड़ सकता हूं? प्रकार के लिए वाइल्डकार्ड _ का उपयोग करना काम नहीं करता:मैं जेनेरिक प्रकार के लिए एफएसआई के लिए एक सुंदर प्रिंटर कैसे जोड़ूं?

> fsi.AddPrinter(fun (A : MyList<_>) -> A.ToString());; 

प्रिंटर उपयोग नहीं कर रहा है।

> fsi.AddPrinter(fun (A : MyList<'T>) -> A.ToString());; 

    fsi.AddPrinter(fun (A : MyList<'T>) -> A.ToString());; 
    -------------------------------^^ 

d:\projects\stdin(70,51): warning FS0064: This construct causes code 
to be less generic than indicated by the type annotations. The type 
variable 'T been constrained to be type 'obj'. 

जो नहीं है मैं क्या चाहते हैं, या तो:

एक प्रकार पैरामीटर में लाना भी एक चेतावनी देता है।

+2

मुझे पूरा यकीन है कि यह संभव नहीं है। एक प्रकार के तर्क के लिए एक ठोस प्रकार की आवश्यकता होती है। – Daniel

+0

क्या आप 'MyList <'T>' के लिए 'ToString' ओवरराइड कर सकते हैं? – Daniel

उत्तर

7

यह सामान्य मामले के लिए काम नहीं करेगा, लेकिन ऐसा लगता है कि आप अपने स्वयं के प्रकार (कम से कम अपने उदाहरण में) के साथ काम कर रहे हैं, और यह मानते हुए कि आप ToString को प्रभावित नहीं करना चाहते हैं, तो आप कुछ ऐसा कर सकते हैं इस:

type ITransformable = 
    abstract member BoxedValue : obj 

type MyList<'T>(values: seq<'T>) = 
    interface ITransformable with 
    member x.BoxedValue = box values 

fsi.AddPrintTransformer(fun (x:obj) -> 
    match x with 
    | :? ITransformable as t -> t.BoxedValue 
    | _ -> null) 

आउटपुट:

> MyList([1;2;3]) 
val it : MyList<int> = [1; 2; 3] 

एक तीसरे पक्ष के सामान्य प्रकार और प्रतिबिंब आप AddPrintTransformer इस्तेमाल कर सकते हैं के लिए मूल्य प्रदर्शित करने के लिए मिलता है। यदि आपके पास स्रोत है तो एक इंटरफ़ेस बस आसान है।

+0

धन्यवाद। लेकिन आप 'obj' टाइप करने के लिए 'AddPrintTransformer' पैरामीटर क्यों घोषित करते हैं? 'ITransformable' का उपयोग क्यों न करें? या यहां तक ​​कि 'AddPrinter' का उपयोग ऐसे फ़ंक्शन के साथ करें जो 'ITransformable' लेता है? –

+0

यह 'ओबीजे' है क्योंकि मैं पहली बार प्रतिबिंब का उपयोग करने की सड़क पर चला गया। आप शायद इसे 'ITransformable' में बदल सकते हैं। मुझे लगता है कि 'AddPrintTransformer' जो आप करने का प्रयास कर रहे हैं उसके लिए बेहतर है क्योंकि, ज्यादातर मामलों में, डिस्प्ले-सक्षम मान पर प्रतिनिधि पर्याप्त है। – Daniel