fsharp

2012-03-09 20 views
11

टाइपफ़ोफ़ के साथ मिलान पहला मैच काम करता है, लेकिन दूसरा नहीं। if/elif की श्रृंखला का उपयोग करने के अलावा, घोषित घोषित किए बिना मिलान करने का कोई तरीका है?fsharp

(ध्यान दें कि मैं मूल्य ELEM उपयोग करते हैं, जबकि मैं चर टी से मेल खाते हैं)

let t = typeof<string> 
    match propType with 
    | t    -> elem.GetValueAsString() :> obj 
    | typeof<string> -> elem.GetValueAsString() :> obj 
+0

थे आप एक वस्तु के अंतर्निहित प्रकार के आधार से मेल करने की कोशिश कर या आप बस अपने परिणाम के बारे में हैरान थे? –

+0

नहीं मेरे पास प्रकार है, और मेरे प्रकार चर के अंतर्निहित प्रकार हमेशा टाइप होंगे। वास्तव में – nicolas

उत्तर

12

आपका पहला पैटर्न वास्तव में typeof<string> मेल नहीं खाता। यह propType को एक नए मान t पर पिछले t को छायांकित करता है जो typeof<string> के बराबर है।

typeof<string> एक शाब्दिक नहीं है, दूसरा पैटर्न भी काम नहीं करता है (हालांकि यह आपके उदाहरण में एक अनावश्यक पैटर्न है)। , तो आप उपयोग कर सकते हैं

match propType with 
    | t when t = typeof<string> -> elem.GetValueAsString() :> obj 
    | t -> elem.GetValueAsString() :> obj 
+0

। नौसिखिया जाल मैं मैच के बारे में पुनः rtfm होगा ... – nicolas

6

आप एक मूल्य के प्रकार के खिलाफ मैच के लिए प्रयास कर रहे हैं: आप इस प्रकार when गार्ड का उपयोग करना होगा? ऑपरेटर

उदाहरण:

let testMatch (toMatch:obj) = match toMatch with 
         | :? string as s -> s.Split([|';'|]).[0] 
         | :? int as i -> (i+1).ToString() 
         | _ -> String.Empty 
+2

मेरे मामले में मैच प्रकार ही है। तो केवल गार्ड काम करता है afaik। – nicolas

+0

ठीक है, कभी भी ध्यान न रखें;) –

+1

यह इस विशेष प्रश्न का उत्तर नहीं था, लेकिन यह मेरे प्रश्न के लिए था। :) –