अस्पष्ट शीर्षक के बारे में क्षमा करें, लेकिन इस सवाल का हिस्सा क्या इन दो वाक्य रचना शैलियों कहा जाता है है मैं एक या दूसरे का उपयोग करना चाहता हूँ?एफ # स्पष्ट मिलान बनाम समारोह वाक्य रचना
उत्तर
मिलान वर्शन एक "पैटर्न मिलान अभिव्यक्ति" कहा जाता है। फ़ंक्शन संस्करण को "पैटर्न मिलान फ़ंक्शन" कहा जाता है। spec की धारा 6.6.4 में मिला।
एक दूसरे का उपयोग शैली की बात है। मैं केवल फ़ंक्शन संस्करण का उपयोग करना पसंद करता हूं जब मुझे केवल एक मैच स्टेटमेंट को परिभाषित करने की आवश्यकता होती है।
वे आपके मामले में एक ही काम करते हैं - function
कीवर्ड fun
कीवर्ड (अज्ञात लैम्बडा बनाने के लिए) के संयोजन की तरह कार्य करता है, इसके बाद match
कीवर्ड होता है।
तो तकनीकी रूप से इन दोनों समान हैं, एक fun
के योग के साथ:
let foo1 = fun x ->
match x with
| 1 -> "one"
| _ -> "not one"
let foo2 = function
| 1 -> "one"
| _ -> "not one"
दोनों वाक्यविन्यास बराबर हैं। अधिकांश प्रोग्रामर एक या दूसरे का चयन करते हैं और फिर लगातार इसका उपयोग करते हैं।
पहला वाक्यविन्यास तब भी अधिक पठनीय रहता है जब कार्य कार्य शुरू करने से पहले कई तर्क स्वीकार करता है।
दूसरे वाक्यविन्यास के लिए समर्थक यह है कि जब लैम्ब्डा में उपयोग किया जाता है, तो यह थोड़ी अधिक terse और पठनीय हो सकता है।
List.map (fun x -> match x with | 1 -> "one" | _ -> "not one") [0;1;2;3;1]
बनाम
List.map (function 1 -> "one" | _ -> "not one") [0;1;2;3;1]
समारोह संस्करण जहां मैच बयान पूरे समारोह है और समारोह केवल एक ही तर्क (tuples एक के रूप में गिनती) है विशेष मामले में पूर्ण मैच वाक्य रचना के लिए एक छोटी हाथ है। यदि आप दो तर्क चाहते हैं तो आपको पूर्ण मिलान वाक्यविन्यास * का उपयोग करने की आवश्यकता है। आप इसे निम्नलिखित दो कार्यों के प्रकारों में देख सकते हैं।
//val match_test : string -> string -> string
let match_test x y = match x, y with
| "A", _ -> "Hello A"
| _, "B" -> "Hello B"
| _ -> "Hello ??"
//val function_test : string * string -> string
let function_test = function
| "A", _ -> "Hello A"
| _, "B" -> "Hello B"
| _ -> "Hello ??"
जैसा कि आप देख सकते हैं कि मिलान संस्करण दो अलग-अलग तर्क लेता है जबकि फ़ंक्शन संस्करण एक एकल tupled तर्क लेता है। मैं सबसे एक तर्क कार्यों के लिए समारोह संस्करण का उपयोग के बाद से मैं समारोह वाक्य रचना क्लीनर लग रहा है लगता है।
* यदि आप वास्तव में चाहते थे कि आप फ़ंक्शन संस्करण को सही प्रकार के हस्ताक्षर प्राप्त कर सकें लेकिन यह मेरी राय में बहुत बदसूरत दिखता है - नीचे उदाहरण देखें।
//val function_match_equivalent : string -> string -> string
let function_match_equivalent x y = (x, y) |> function
| "A", _ -> "Hello A"
| _, "B" -> "Hello B"
| _ -> "Hello ??"
बस पूर्णता के लिए, मैं सिर्फ Expert FSharp के पेज 321 को मिला:।
"ध्यान दें, लिस्टिंग 12-2 का उपयोग करता है अभिव्यक्ति प्रपत्र
function pattern-rules -> expression
यह(fun x -> match x with pattern-rules -> expression)
के बराबर है और के रूप में विशेष रूप से सुविधाजनक है भेदभाव वाले संघों पर सीधे काम करने वाले कार्यों को परिभाषित करने का एक तरीका।"
समारोह केवल एक ही तर्क के लिए अनुमति देता है, लेकिन पैटर्न मिलान के लिए अनुमति देता है, जबकि मज़ा अधिक सामान्य और सुविधाजनक ढंग से एक समारोह को परिभाषित करने के लिए है यहाँ एक नज़र डालें:। http://caml.inria.fr/pub/docs/manual-ocaml/expr.html
आप क्यों कहते हैं केवल अंतिम तर्क के बजाय केवल 1 तर्क? 1 से अधिक तर्क होना और "फ़ंक्शन" का उपयोग करना संभव है। क्या यह एक उच्च आदेश समारोह व्याख्या है? – symbiont
यह एक है पुराने सवाल लेकिन मैं अपने $ 0.02 फेंक देते हैं।
सामान्य तौर पर मैं के बाद से मैं अजगर दुनिया कहाँ से आए बेहतर match
संस्करण पसंद "स्पष्ट अंतर्निहित से बेहतर है।"
बेशक पैरामीटर पर प्रकार की जानकारी की जरूरत है, तो function
संस्करण नहीं किया जा सकता।
OTOH मैं Stringer
द्वारा किए गए तो मैं सरल lambdas में function
उपयोग करने के लिए शुरू कर देंगे तर्क पसंद है।
- 1. एफ # वाक्य रचना भ्रम
- 2. एफ # निर्माता वाक्य रचना
- 3. तत्काल समारोह मंगलाचरण वाक्य रचना
- 4. Clojure समारोह तर्क वाक्य रचना
- 5. डॉट वाक्य रचना बनाम गेटर के साथ विधि वाक्य रचना =
- 6. समारोह कोशिश पकड़ वाक्य रचना और मुख्य
- 7. XPATH वाक्य रचना के साथ मिलान पाठ
- 8. बनाम डेटा प्रकार क्षेत्र निकासी के लिए रिकॉर्ड वाक्य रचना समारोह मिलान पैटर्न
- 9. वर एक = ई.पू. = समारोह() {} वाक्य रचना
- 10. सी ++ typedef सदस्य समारोह हस्ताक्षर वाक्य रचना
- 11. वाक्य रचना
- 12. अप्रत्याशित स्काला वाक्य रचना
- 13. वाक्य रचना संदेह
- 14. सी ++ निरंतर वाक्य रचना
- 15. ग्रूवी बनाम जावा वाक्य रचना विसंगति
- 16. typedef वाक्य रचना
- 17. पैटर्न मिलान, एफ # बनाम एरलांग
- 18. रूबी वाक्य रचना
- 19. अमान्य वाक्य रचना
- 20. कैसे $ (तत्व) .function() वाक्य रचना
- 21. विम वाक्य रचना कई लाइनों
- 22. अजीब वाक्य रचना
- 23. Diff फ़ाइल वाक्य रचना
- 24. उस्तरा वाक्य रचना
- 25. Emacs लिस्प वाक्य रचना
- 26. सी ++ वाक्य रचना अस्पष्टता
- 27. प्रारंभकर्ता वाक्य रचना
- 28. विस्तारित वाक्य रचना
- 29. वाक्य रचना जावा
- 30. समझौता NSLog वाक्य रचना
यह वास्तव में दूसरे के चारों ओर जिस तरह से नहीं है - यानी 'fun' तकनीकी रूप से' समारोह के संदर्भ में परिभाषित किया गया है | _ -> ... '? > ... '' होगा मज़ा एक्स - -> मजेदार y - –
विशिष्ट, 'मज़ा एक्स y होना करने के लिए> ...', और उसके बाद 'मज़ा एक्स -> ...' होगा 'समारोह | एक्स -> ... '। यही कारण है कि आप 'मजेदार' में पैटर्न मिलान कर सकते हैं - उदा। मजेदार (एक्स :: एक्सएस) -> ... '। –