यह कैसे संभव है, वहां क्या हो रहा है?हास्केल में, + एक फ़ंक्शन है, (+ 2) एक फ़ंक्शन है, (+ 2 3) 5 है। वहां वास्तव में क्या चल रहा है?
क्या इसके लिए कोई नाम है?
अन्य भाषाओं में यह समान व्यवहार है?
मजबूत टाइपिंग सिस्टम के बिना कोई भी?
उत्तर
असल में (+ 2 3)
एक प्रकार की त्रुटि है। (+) 2 3
या (+ 2) 3
आपको 5.
यदि आप प्रकारों को देखते हैं तो यह व्यवहार वास्तव में सरल और सहज है। +
जैसे इंफिक्स ऑपरेटरों की जटिलताओं से बचने के लिए, मैं इसके बजाय plus
फ़ंक्शन का उपयोग करने जा रहा हूं। मैं टाइपस्लास लाइन शोर को कम करने के लिए Int
पर काम करने के लिए plus
पर भी विशेषज्ञता प्राप्त करने जा रहा हूं।
कहें कि हमारे पास प्रकार का एक कार्य plus
है। इसे पढ़ने का एक तरीका है "दो Int
एस का एक फ़ंक्शन जो Int
देता है"। लेकिन यह नोटेशन उस पठन के लिए थोड़ा बेकार है, है ना? वापसी का प्रकार विशेष रूप से कहीं भी अलग नहीं किया जाता है। हम इस तरह फ़ंक्शन प्रकार हस्ताक्षर क्यों लिखेंगे? चूंकि ->
सही सहयोगी है, तो समकक्ष प्रकार Int -> (Int -> Int)
होगा। ऐसा लगता है कि यह एक Int
से एक फ़ंक्शन (Int
से Int
पर एक फ़ंक्शन) के रूप में यह कहता है "। लेकिन वे दो प्रकार वास्तव में वही हैं, और बाद की व्याख्या यह समझने की कुंजी है कि यह व्यवहार कैसे काम करता है।
हास्केल सभी कार्यों को एक ही तर्क से एक परिणाम के रूप में देखता है। आपके मन में कंप्यूटेशंस हो सकते हैं जहां गणना का नतीजा दो या दो से अधिक इनपुट (जैसे plus
) पर निर्भर करता है।हास्केल का कहना है कि फ़ंक्शनplus
एक ऐसा फ़ंक्शन है जो एक इनपुट लेता है, और एक आउटपुट उत्पन्न करता है जो अन्य फ़ंक्शन है। यह दूसरा फ़ंक्शन एक इनपुट लेता है और एक आउटपुट उत्पन्न करता है जो एक संख्या है। क्योंकि दूसरे फ़ंक्शन की गणना पहली बार की गई थी (और पहले फ़ंक्शन में अलग-अलग इनपुट के लिए अलग होगी), "अंतिम" आउटपुट दोनों इनपुट पर निर्भर हो सकता है, इसलिए हम इन कार्यों के साथ कई इनपुट के साथ कंप्यूटेशंस लागू कर सकते हैं एकल इनपुट
मैंने वादा किया कि यदि आप प्रकारों को देखते हैं तो यह समझना वास्तव में आसान होगा। यहाँ उनके प्रकार के साथ कुछ उदाहरण भाव स्पष्ट रूप से व्याख्या किए गए है:
plus :: Int -> Int -> Int
plus 2 :: Int -> Int
plus 2 3 :: Int
कुछ एक समारोह है और आप एक तर्क उसे लागू करने के कि तुम सब करने की जरूरत है आवेदन का परिणाम के प्रकार के प्राप्त करने के लिए किया गया है अप करने के लिए सब कुछ को दूर फ़ंक्शन के प्रकार से पहला तीर। यदि वह एक प्रकार छोड़ देता है जिसमें अधिक तीर होते हैं, तो आपके पास अभी भी एक फ़ंक्शन है! जैसे-जैसे आप तर्क को अभिव्यक्ति का अधिकार जोड़ते हैं, आप इसके प्रकार के बाएं से पैरामीटर प्रकार हटाते हैं। प्रकार यह तुरंत स्पष्ट करता है कि सभी मध्यवर्ती परिणामों का प्रकार क्या है, और plus 2
एक ऐसा फ़ंक्शन है जिसे आगे लागू किया जा सकता है (इसके प्रकार में एक तीर है) और plus 2 3
नहीं है (इसके प्रकार में तीर नहीं है)।
"करीइंग" एक तर्क के एक समारोह में दो तर्कों के एक फ़ंक्शन को बदलने की प्रक्रिया है जो किसी अन्य तर्क का कार्य देता है जो मूल कार्य लौटाता है। इसका उपयोग हास्केल जैसी भाषाओं की संपत्ति को संदर्भित करने के लिए भी किया जाता है जो स्वचालित रूप से सभी कार्यों को इस तरह से काम करता है; लोग कहेंगे कि हास्केल "एक करीबी भाषा है" या "करी है", या "करीबी कार्यों" है।
ध्यान दें कि यह विशेष रूप से सुंदरता से काम करता है क्योंकि फ़ंक्शन एप्लिकेशन के लिए हास्केल का वाक्यविन्यास सरल टोकन आसन्नता है। plus
के आवेदन के रूप में plus
के आवेदन के रूप में plus
2
और फिर पर परिणाम के आवेदन के रूप में plus 2 3
को पढ़ने के लिए स्वतंत्र हैं; आप मानसिक रूप से इसे मॉडल कर सकते हैं जिस तरह से आप उस समय क्या कर रहे हैं जो आप कर रहे हैं।
सी-जैसे फ़ंक्शन एप्लिकेशन के साथ ब्रांड्सयुक्त तर्क सूची द्वारा भाषाओं में, यह थोड़ा सा टूट जाता है। plus(2, 3)
plus(2)(3)
से बहुत अलग है, और इस वाक्यविन्यास वाली भाषाओं में plus
के दो संस्करणों में शायद अलग-अलग प्रकार होंगे। इसलिए उस तरह के वाक्यविन्यास वाली भाषाओं में सभी कार्यों को हर समय घुमाया नहीं जाता है, या यहां तक कि आपके द्वारा पसंद किए जाने वाले किसी भी फ़ंक्शन के स्वचालित करीकरण के लिए भी नहीं होता है। लेकिन ऐसी भाषाओं ने ऐतिहासिक रूप से पहले वर्ग मूल्यों के रूप में कार्य नहीं किया है, जो एक महत्वपूर्ण बिंदु को घुमाने की कमी बनाता है।
+1 उत्कृष्ट स्पष्टीकरण। पसन्द आया। – Nawaz
बेशक अच्छी व्याख्या, हालांकि निश्चित रूप से 'प्लस (2, 3)' बनाम 'प्लस (2) (3)' का आपका उदाहरण और उनके अलग-अलग प्रकार हैं, केवल "सी-जैसे फ़ंक्शन एप्लिकेशन वाली भाषाएं" नहीं, बल्कि हास्केल पर भी लागू होते हैं। 'प्लस :: (इंट, इंट) -> इंट 'प्लस (2, 3)' और 'प्लस :: इंट -> इंट -> इंट' की अनुमति देता है 'प्लस (2) (3)' –
@ बर्टी हां हां , हालांकि उनमें से कोई भी हास्केल में आवेदन लिखने का एक मूर्ख तरीका नहीं है। और 'प्लस (2, 3)' हास्केल में एक फंक्शन को एक तर्क में लागू कर रहा है जो एक ट्यूपल है; जो सी-जैसे वाक्यविन्यास में 'प्लस ((2, 3)) के रूप में आता है। आप निश्चित रूप से मल्टी-तर्क फ़ंक्शंस के एन्कोडिंग के रूप में टुपल लेने वाले फ़ंक्शंस देख सकते हैं (जैसे फ़ंक्शन रिटर्निंग फ़ंक्शन मल्टी तर्क फ़ंक्शंस का एन्कोडिंग है), लेकिन मैं उन्हें अलग से सोचना पसंद करता हूं। – Ben
हास्केल में, आप दो तर्कों का एक कार्य ले सकते हैं, इसे एक तर्क पर लागू कर सकते हैं, और एक तर्क का कार्य प्राप्त कर सकते हैं। वास्तव में, कड़ाई से बोलते हुए, + दो तर्कों का एक कार्य नहीं है, यह एक तर्क का एक कार्य है जो एक तर्क का कार्य देता है।
- आम आदमी की दृष्टि में,
+
वास्तविक समारोह है और यह मापदंडों की एक निश्चित संख्या प्राप्त करने के लिए जब तक यह रिटर्न (इस मामले में 2 या अधिक) इंतज़ार कर रहा है। यदि आप इसे दो या अधिक पैरामीटर नहीं देते हैं, तो यह एक अन्य पैरामीटर के लिए प्रतीक्षा करने वाला फ़ंक्शन रहेगा। - यह Currying
- कार्यात्मक भाषाओं (स्काला, योजना, आदि)
- सबसे कार्यात्मक भाषाओं दृढ़ता से लिखे जाने पर बहुत से कहा जाता है, लेकिन जो उद्यम में अच्छी तरह से काम, क्योंकि उसमें त्रुटियां कम कर देता है यह अंत में अच्छा है, या महत्वपूर्ण प्रणाली।
एक साइड नोट के रूप में, भाषा हास्केल का नाम हास्केल करी के नाम पर रखा गया है, जिसने संयोजक तर्क पर काम करते समय कार्यात्मक करी की घटना को दोबारा खोज लिया।
हास्केल में, सभी फ़ंक्शंस बिल्कुल 1 इनपुट लेते हैं, और बिल्कुल 1 आउटपुट का उत्पादन करते हैं। कभी-कभी, फ़ंक्शन का इनपुट या आउटपुट एक और फ़ंक्शन हो सकता है। फ़ंक्शन का इनपुट या आउटपुट भी एक टुपल हो सकता है।आप दो तरीकों में से एक में एक से अधिक जानकारी के साथ एक समारोह अनुकरण कर सकते हैं:
(in1, in2) -> out
उपयोग आउटपुट के रूप में एक समारोह के इनपुट के रूप में एक टपल का प्रयोग करें *
in1 -> (in2 -> out)
इसी प्रकार, आप दो तरीकों में से एक में एकाधिक आउटपुट के साथ एक फ़ंक्शन अनुकरण कर सकते हैं:
एक टपल आउटपुट के रूप में
in -> (out1, out2)
उपयोग एक "दूसरे इनपुट" (एक ला समारोह के रूप में उत्पादन)
in -> ((out1 -> (out2 -> a)) -> a)
के रूप में एक समारोह का प्रयोग करें * * इस तरीका आमतौर पर हास्केलर्स
(+)
फ़ंक्शन 2 इनपुट लेने के अनुकरण करता है उत्पादन के रूप में एक समारोह के उत्पादन के ठेठ हास्केल तरीके में। (संचार :)
(+) :: Int -> (Int -> Int)
सुविधा के लिए, में आसानी के लिए Int
को विशेषता ->
राइट साहचर्य है, इसलिए (+)
के लिए प्रकार हस्ताक्षर भी
(+) :: Int -> Int -> Int
(+)
लिखा जा सकता है एक ऐसा फ़ंक्शन है जो एक संख्या में होता है, और संख्या से संख्या में एक और फ़ंक्शन उत्पन्न करता है।
(+) 5
(+)
को 5
पर तर्क देने का परिणाम है, इसलिए, यह संख्या से संख्या का एक कार्य है।
(5 +)
एक और तरीका है लिखने के लिए (+) 5
2 + 3
(+) 2 3
लेखन का एक और तरीका है। फंक्शन एप्लिकेशन बाएं-सहयोगी है, इसलिए यह (((+) 2) 3)
लिखने का एक और तरीका है। दूसरे शब्दों में: इनपुट इनपुट 2
पर फ़ंक्शन लागू करें। नतीजा एक समारोह होगा। फ़ंक्शन लें, और इसे इनपुट 3
पर लागू करें। का परिणाम एक संख्या है।
इसलिए, (+)
एक फ़ंक्शन है, (5 +)
एक फ़ंक्शन है, और (+) 2 3
एक संख्या है।
- 1. क्या वहां कोई "फ़ंक्शन आकार प्रोफाइलर" है?
- 2. एक ही समय में 2 फ़ंक्शन चलाएं
- 3. एंड्रॉयड चल रहा है वास्तव में
- 4. क्या वीबीस्क्रिप्ट में एक substring() फ़ंक्शन है?
- 5. हास्केल में, क्या एक अंतर्निहित फ़ंक्शन है जो एक तत्व की सूची बनाता है?
- 6. 'कहां' में घोषणाएं - क्या चल रहा है?
- 7. जावास्क्रिप्ट में 2 /// 2 2 क्यों है?
- 8. हास्केल में पॉलीवायरैडिक फ़ंक्शन
- 9. हास्केल विदेशी फ़ंक्शन इंटरफ़ेस में '# टाइप' का क्या अर्थ है?
- 10. एक वीबी.Net फ़ंक्शन जो स्ट्रिंग लौटाता है वास्तव में केवल एक ही चरित्र लौटाता है?
- 11. हास्केल समेकन - वास्तव में nondeterministic फोर्कियो है?
- 12. numpy.apply_along_axis वास्तव में क्या करता है?
- 13. अमेज़ॅन ईसी 2 पर "आभासी कोर" वास्तव में क्या है?
- 14. यह वास्तव में क्या करता है? - पागल सी ++ फ़ंक्शन
- 15. क्या कोई जावा फ़ंक्शन या उपयोग कक्षा है जो इस तरह से घूमती है: func (3/2) = 2?
- 16. एक्स एक्सओआर (x/2) का रिवर्स फ़ंक्शन क्या है?
- 17. एक स्क्रिप्ट में scipy's oneway anova चल रहा है
- 18. फ़ंक्शन घोषणा में `* &` का क्या अर्थ है?
- 19. PHP का gc_enable फ़ंक्शन वास्तव में क्या करता है?
- 20. पता लगाएं कि कोई जावास्क्रिप्ट फ़ंक्शन चल रहा है
- 21. पायथन में एक फ़ंक्शन प्रिंट कर रहा है?
- 22. एक प्रोग्राम संगतता मोड में चल रहा है
- 23. हास्केल में यह रिकर्सिव फ़ंक्शन इतना धीमा क्यों है?
- 24. document.getElementByID एक फ़ंक्शन नहीं है
- 25. एमईएफ 2 में क्या शामिल है?
- 26. फ़ंक्शन में हास्केल प्रिंट लाइन्स
- 27. फ़ंक्शन अदृश्य() क्या करता है?
- 28. फ़ंक्शन कॉल स्किप पर कॉलिंग आकार वास्तव में फ़ंक्शन को कॉल कर रहा है!}
- 29. 2 अलग हैश फ़ंक्शन का उपयोग फ़ाइल अखंडता की जांच करने का एक अच्छा तरीका है?
- 30. एक HTTP इकाई वास्तव में क्या है?
हास्केल के लिए मानक पाठ्यपुस्तक/ट्यूटोरियल प्राप्त करें? – ShiDoiSi
कैसे संभव है? –
जिन नामों को आप ढूंढ रहे हैं वे करी और आंशिक एप्लिकेशन हैं। –