2011-09-03 10 views
12

एक इनलाइन समारोह एक तरह की कोई समस्या बना सकते हैं के लिए:सक्रिय पैटर्न और सदस्य बाधा

let inline implicit arg = 
    (^a : (static member op_Implicit : ^b -> ^a) arg) 

दिया ऑपरेटर या तर्क पर सदस्य की जरूरत पड़ेगी। क्या कुछ समान के आधार पर मिलान करने का कोई तरीका है?

मैं एक सक्रिय पैटर्न बनाना चाहता हूं, जहां कोई भी तर्क जो उस विधि को पारित किया गया है जो एक उल्लिखित फ़ंक्शन की बाधा से मेल खाता है, उपर्युक्त ट्रिगर करता है और कुछ और त्रुटि प्रबंधन के हिस्से के रूप में बाकी सब कुछ समाप्त होता है।

उत्तर

28

ऐसा लगता है कि आप इनलाइन सक्रिय पैटर्न भी लिख सकते हैं। मैंने पहले इसका इस्तेमाल नहीं किया है, लेकिन मैंने इसे आजमाया और ऐसा लगता है कि यह ठीक काम करता है।

let inline (|Test|_|) (a:^T) : option<^R> = 
    (^T : (member Test : unit -> option<^R>) a) 

अब आप कुछ वस्तुओं है कि Test विधि को परिभाषित परिभाषित करने और पैटर्न का उपयोग कर उन्हें मिलान कर सकते हैं:

type A() = 
    member x.Test() = Some(10) 

match new A() with 
| Test(n) -> printfn "%d" n 
| _ -> printfn "failed" 

यह नीचे Test पैटर्न किसी भी वस्तु है कि Test विधि है कि option<^R> रिटर्न लागू करता है के साथ इस्तेमाल किया जा सकता एक बहुत ही रोचक तकनीक की तरह दिखता है, क्योंकि पैटर्न मिलान अब ऑब्जेक्ट का हिस्सा है।

0

मुझे लगता है कि आपको प्रतिबिंब का उपयोग करना होगा, उदा। एक ऐसा कार्य करें जो o:obj लेता है और फिर o.GetType() से अधिक सदस्यों को प्रतिबिंबित करता है।

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