11
  1. यह कैसे संभव है, वहां क्या हो रहा है?हास्केल में, + एक फ़ंक्शन है, (+ 2) एक फ़ंक्शन है, (+ 2 3) 5 है। वहां वास्तव में क्या चल रहा है?

  2. क्या इसके लिए कोई नाम है?

  3. अन्य भाषाओं में यह समान व्यवहार है?

  4. मजबूत टाइपिंग सिस्टम के बिना कोई भी?

+2

हास्केल के लिए मानक पाठ्यपुस्तक/ट्यूटोरियल प्राप्त करें? – ShiDoiSi

+1

कैसे संभव है? –

+6

जिन नामों को आप ढूंढ रहे हैं वे करी और आंशिक एप्लिकेशन हैं। –

उत्तर

38

असल में (+ 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 के आवेदन के रूप में plus2 और फिर पर परिणाम के आवेदन के रूप में plus 2 3 को पढ़ने के लिए स्वतंत्र हैं; आप मानसिक रूप से इसे मॉडल कर सकते हैं जिस तरह से आप उस समय क्या कर रहे हैं जो आप कर रहे हैं।

सी-जैसे फ़ंक्शन एप्लिकेशन के साथ ब्रांड्सयुक्त तर्क सूची द्वारा भाषाओं में, यह थोड़ा सा टूट जाता है। plus(2, 3)plus(2)(3) से बहुत अलग है, और इस वाक्यविन्यास वाली भाषाओं में plus के दो संस्करणों में शायद अलग-अलग प्रकार होंगे। इसलिए उस तरह के वाक्यविन्यास वाली भाषाओं में सभी कार्यों को हर समय घुमाया नहीं जाता है, या यहां तक ​​कि आपके द्वारा पसंद किए जाने वाले किसी भी फ़ंक्शन के स्वचालित करीकरण के लिए भी नहीं होता है। लेकिन ऐसी भाषाओं ने ऐतिहासिक रूप से पहले वर्ग मूल्यों के रूप में कार्य नहीं किया है, जो एक महत्वपूर्ण बिंदु को घुमाने की कमी बनाता है।

+2

+1 उत्कृष्ट स्पष्टीकरण। पसन्द आया। – Nawaz

+0

बेशक अच्छी व्याख्या, हालांकि निश्चित रूप से 'प्लस (2, 3)' बनाम 'प्लस (2) (3)' का आपका उदाहरण और उनके अलग-अलग प्रकार हैं, केवल "सी-जैसे फ़ंक्शन एप्लिकेशन वाली भाषाएं" नहीं, बल्कि हास्केल पर भी लागू होते हैं। 'प्लस :: (इंट, इंट) -> इंट 'प्लस (2, 3)' और 'प्लस :: इंट -> इंट -> इंट' की अनुमति देता है 'प्लस (2) (3)' –

+0

@ बर्टी हां हां , हालांकि उनमें से कोई भी हास्केल में आवेदन लिखने का एक मूर्ख तरीका नहीं है। और 'प्लस (2, 3)' हास्केल में एक फंक्शन को एक तर्क में लागू कर रहा है जो एक ट्यूपल है; जो सी-जैसे वाक्यविन्यास में 'प्लस ((2, 3)) के रूप में आता है। आप निश्चित रूप से मल्टी-तर्क फ़ंक्शंस के एन्कोडिंग के रूप में टुपल लेने वाले फ़ंक्शंस देख सकते हैं (जैसे फ़ंक्शन रिटर्निंग फ़ंक्शन मल्टी तर्क फ़ंक्शंस का एन्कोडिंग है), लेकिन मैं उन्हें अलग से सोचना पसंद करता हूं। – Ben

6

हास्केल में, आप दो तर्कों का एक कार्य ले सकते हैं, इसे एक तर्क पर लागू कर सकते हैं, और एक तर्क का कार्य प्राप्त कर सकते हैं। वास्तव में, कड़ाई से बोलते हुए, + दो तर्कों का एक कार्य नहीं है, यह एक तर्क का एक कार्य है जो एक तर्क का कार्य देता है।

2
  1. आम आदमी की दृष्टि में, + वास्तविक समारोह है और यह मापदंडों की एक निश्चित संख्या प्राप्त करने के लिए जब तक यह रिटर्न (इस मामले में 2 या अधिक) इंतज़ार कर रहा है। यदि आप इसे दो या अधिक पैरामीटर नहीं देते हैं, तो यह एक अन्य पैरामीटर के लिए प्रतीक्षा करने वाला फ़ंक्शन रहेगा।
  2. यह Currying
  3. कार्यात्मक भाषाओं (स्काला, योजना, आदि)
  4. सबसे कार्यात्मक भाषाओं दृढ़ता से लिखे जाने पर बहुत से कहा जाता है, लेकिन जो उद्यम में अच्छी तरह से काम, क्योंकि उसमें त्रुटियां कम कर देता है यह अंत में अच्छा है, या महत्वपूर्ण प्रणाली।

एक साइड नोट के रूप में, भाषा हास्केल का नाम हास्केल करी के नाम पर रखा गया है, जिसने संयोजक तर्क पर काम करते समय कार्यात्मक करी की घटना को दोबारा खोज लिया।

8

हास्केल में, सभी फ़ंक्शंस बिल्कुल 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 एक संख्या है।

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