2012-05-13 16 views
6

मैं एफ # सीख रहा हूं और ढूंढ रहा हूं कि मैं उन चीज़ों को लिख रहा हूं जो काम करते हैं लेकिन जो मैं पूरी तरह से समझ नहीं पा रहा हूं। यहाँ एक उदाहरण घर गए संदेशों showHelp हैकई बयान के साथ एफ # लैम्ब्डा अभिव्यक्ति

let processArgs args = 
    match args with 
    | null 
    | [||]   -> [fun() -> getCredentials(); home 20; mentions 20; messages 20] 
    | [|"-h"|] 
    | [|"-?"|]  -> [showHelp] 
    | [|"-reset"|] -> [clearAllSettings] 
    | _    -> [fun() -> printfn "%s" (String.Join(" ", args))] 

[<EntryPoint>] 
    let main (args:string[]) = 
    try 
     let actions = processArgs args 
     List.iter (fun action -> action()) actions 
     0 
    finally 
     Console.ResetColor() 
     Console.CursorVisible <- true 

तरीकों getCredentials,, का उल्लेख है,,, और clearAllSettings सब सरल कार्य हैं और आप क्या उम्मीद करते हैं।

[fun() -> getCredentials(); home 20; mentions 20; messages 20] 

काम करता है जैसे मैं चाहता हूँ:

लाइन (हाँ, यह एक चहचहाना ग्राहक है, कि नए 'नमस्ते विश्व' डेमो नहीं है?)। यह getCredentials, फिर घर, फिर उल्लेख करता है, तो संदेश

मेरे परिप्रेक्ष्य से, अर्धविराम एक कथन विभाजक की तरह काम कर रहा है। मैंने इसे पहले वर्णित नहीं देखा है। क्या यह यहाँ चल रहा है?

क्या यह लिखने का एक और बेवकूफ तरीका है (दूसरे शब्दों में, क्या एक अनुभवी एफ # प्रोग्रामर फर्श पर हंसते हुए हंसते हुए रोल करेगा)?

अधिक जानकारी: मेरा मूल उद्देश्य कार्यों की एक सूची होना था और फिर विकल्पों को खोजने के रूप में क्रियाएं जोड़ना था। सी # में मैं आमतौर पर सूची < एक्शन>() के साथ ऐसा करता हूं। अर्धविराम की बात ने मुझे आश्चर्यचकित कर दिया क्योंकि मूल रूप से मैंने इसे लिखने की कोशिश की:

[getCredentials; home 20; mentions 20; messages 20] 

लेकिन संकलक इसे पसंद नहीं आया।

+1

खैर, भाषा विनिर्देश चारों ओर से खुदाई के कुछ ही घंटों जवाब पता चलता है। यह वाक्यविन्यास का एक रूप है जिसे वर्बोज सिंटैक्स कहा जाता है। यहां वर्णित एक लिंक दिया गया है: http://msdn.microsoft.com/en-us/library/dd233199.aspx मैं अभी भी सोच रहा हूं कि कमांड लाइन तर्कों को पार करने के लिए मेरा दृष्टिकोण यह है कि F # 'ers यह कैसे करेंगे। –

उत्तर

3

जब आप लिखें:

[fun() -> getCredentials(); home 20; mentions 20; messages 20] 

संकलक केवल एक ही तत्व प्रकार unit -> unit की एक समारोह है, जिसके साथ एक सूची बनाता है। S1 ; S2 अनुक्रम संरचना है जब S1 के पास unit का प्रकार है, और S1 और S2 क्रम में निष्पादित किए जाते हैं और S2 का परिणाम वापस कर दिया जाता है। इसलिए, तीन कार्य home, mentions और messages वास्तव में हस्ताक्षर int -> unit है।

आप 4 विभिन्न कार्यों की एक सूची बनाने के लिए चाहते हैं, यह होना चाहिए:

[ getCredentials; // ; is optional 
    fun() -> home 20; 
    fun() -> mentions 20; 
    fun() -> messages 20 ] 

इन कार्यों खाली स्थान के द्वारा अलग किया जाता का उपयोग कर के भ्रम से बचने के; सूची डेलीमीटर और अनुक्रम संरचना के रूप में।

के बाद से अपने उदाहरण केवल एक ही तत्वों के साथ सभी सूचियों है, यह एक बहुत सरल किया जा सकता है:

let processArgs = function 
    | [||]   -> getCredentials(); home 20; mentions 20; messages 20 
    | [|"-h"|] 
    | [|"-?"|]  -> showHelp() 
    | [|"-reset"|] -> clearAllSettings() 
    | args   -> printfn "%s" (String.Join(" ", args)) 

[<EntryPoint>] 
let main (args:string[]) = 
    try 
    processArgs args 
    0 
    finally 
    Console.ResetColor() 
    Console.CursorVisible <- true 
+0

आप सही महोदय हैं। मेरे सी # idioms रास्ते में हो रही है। धन्यवाद। –

+0

बस एक छोटा सुधार, | _ -> ... होना चाहिए | तर्क -> ... – Bernadette

+0

धन्यवाद @ बर्नाडेट, यह तय किया गया है। – pad

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