2015-04-14 13 views
6

पर आधारित पैटर्न मिलान F # में आप पैटर्न फ़ंक्शन हस्ताक्षर पर मिलान कर सकते हैं। मैं फ़ंक्शन के निष्पादन को मापने और आंकड़ों के लिए कॉल करने वाले फ़ंक्शन के साथ कई फ़ंक्शन सजाने के लिए चाहता हूं। वर्तमान समारोह मैं है:फ़ंक्शन हस्ताक्षर

let WrapFunctionWithPrefix(metrics:Metric.Client.IRecorder, functionToWrap, prefix) = 
    let metricsIdentifier = (sprintf "%s.%s" prefix Environment.MachineName) 
    using (metrics.StartTimer(metricsIdentifier)) (fun metrics -> functionToWrap) 

आप ऊपर देख सकते हैं, उपसर्ग अलग अलग होंगे, और हमारे आवेदन में यह प्रति समारोह परिभाषा अलग अलग होंगे। तो बजाय उपाय उपसर्ग में हर बार जब मैं निम्नलिखित की तरह कुछ करना चाहता हूँ पारित करने के लिए की तुलना में:

let WrapFunction metrics afunc = 
    match afunc with 
    | :? (int -> int) -> WrapFunctionWithPrefix(metrics, afunc, "My function 1") 
    | :? (string -> string) -> WrapFunctionWithPrefix(metrics, afunc, "My function 2") 
    | _ -> failwith "Unknown function def" 

वहाँ पैटर्न के किसी भी तरह से एफ # में समारोह हस्ताक्षर के आधार पर मिलान क्या है?

किसी भी मदद की सराहना की।

बिली

उत्तर

7

क्या मामलों को डीयू के रूप में घोषित करना संभव होगा?

type MyFunctions = 
| Intish of int -> int 
| Stringish of string -> string 
+0

चीयर्स, इस मार्ग से नीचे चला गया और काम किया। थोड़ा और सुरुचिपूर्ण! – bstack

3
let WrapFunction metrics afunc = 
    match box afunc with 
    | :? (int -> int) -> WrapFunctionWithPrefix(metrics, afunc, "My function 1") 
    | :? (string -> string) -> WrapFunctionWithPrefix(metrics, afunc, "My function 2") 
    | _ -> failwith "Unknown function def" 

अपने पैटर्न मैच के लिए काम करेंगे। आप आमतौर पर box अज्ञात प्रकारों को कास्ट करने की कोशिश करने से पहले समाप्त होते हैं, जैसे:? मूल्य प्रकारों पर इस्तेमाल नहीं करना पसंद नहीं है।

मुझे पूरा यकीन नहीं है कि आपका उपयोग कथन आपके द्वारा वापस आने वाले फ़ंक्शन के साथ कैसे सहभागिता करेगा। मुझे लगता है कि यह मेट्रिक्स का निपटान करेगा और तुरंत कार्य वापस कर देगा, जो शायद आप नहीं चाहते हैं।

+3

यह भी ध्यान दें कि आपको अपने 'afunc'' पैरामीटर पर कोई भी प्रकार की सुरक्षा नहीं मिलती है। अगर कोई ऐसी चीज़ में गुजरना चाहता है जो फ़ंक्शन नहीं है, तो संकलक उन्हें रोक नहीं पाएगा। – mavnn

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