मेरे पास न तो पीएचडी है, न ही सीएस और न ही किसी अन्य तरह की डिग्री है और न ही गणित और न ही वास्तव में कोई अन्य क्षेत्र है। मैं स्काला और न ही किसी अन्य इसी तरह की भाषा के साथ कोई पूर्व अनुभव है। मुझे दूरस्थ रूप से तुलनीय प्रकार की प्रणालियों के साथ कोई अनुभव नहीं है। वास्तव में, केवल भाषा है कि मैं सिर्फ एक सतही ज्ञान जिनमें से भी से अधिक है एक प्रकार प्रणाली पास्कल, वास्तव में अपने परिष्कृत प्रकार प्रणाली के लिए जाना जाता नहीं है। (हालांकि यह करता रेंज प्रकार, जो AFAIK काफी कोई अन्य भाषा है, लेकिन यह वास्तव में यहाँ प्रासंगिक नहीं है।) अन्य तीन भाषाओं मैं जानता हूँ कि बुनियादी, स्मालटाक और रूबी, जिनमें से कोई भी यहां तक कि एक प्रकार प्रणाली होती है।
और फिर भी, मुझे map
आपके द्वारा पोस्ट किए गए फ़ंक्शन के हस्ताक्षर को समझने में कोई परेशानी नहीं है । यह मुझे बहुत हद तक उसी हस्ताक्षर की तरह दिखता map
है जो हर दूसरी भाषा में है जिसे मैंने कभी देखा है। अंतर यह है कि यह संस्करण अधिक सामान्य है। हास्केल कहते हैं, यह सी ++ एसटीएल की तुलना में अधिक दिखता है। विशेष रूप से, यह केवल तर्क की आवश्यकता है कि ठोस संग्रह प्रकार से दूर सार है IterableLike
, और यह भी ठोस रिटर्न प्रकार से दूर सार केवल आवश्यकता है कि एक अंतर्निहित रूपांतरण समारोह मौजूद है जो परिणाम मूल्यों के उस संग्रह से बाहर कुछ का निर्माण कर सकते हैं। हां, यह काफी जटिल है, लेकिन यह वास्तव में सामान्य प्रोग्रामिंग के सामान्य प्रतिमान की एक अभिव्यक्ति है: कुछ भी ऐसा न मानें जो आपको वास्तव में नहीं करना है।
इस मामले में, map
वास्तव में एक सूची होने के लिए संग्रह की आवश्यकता नहीं है , या आदेश दिया जा रहा है या क्रमबद्ध या ऐसा कुछ भी किया जा रहा है। केवल एक चीज जो map
परवाह करती है वह यह है कि यह संग्रह के सभी तत्वों तक पहुंच प्राप्त कर सकता है, एक के बाद एक, लेकिन किसी विशेष क्रम में नहीं। और यह जानने की आवश्यकता नहीं है कि परिणामी संग्रह क्या है, इसे केवल यह जानना है कि इसे कैसे बनाया जाए। तो, इसके प्रकार के हस्ताक्षर की आवश्यकता है।
तो, के बजाय
map :: (a → b) → [a] → [b]
जो पारंपरिक प्रकार का हस्ताक्षर है map
, इसके लिए एक ठोस की आवश्यकता नहीं है List
, बल्कि केवल एक IterableLike
डेटा संरचना है
map :: (IterableLike i, IterableLike j) ⇒ (a → b) → i → j
जिसे तब केवल इस बात की आवश्यकता के द्वारा सामान्यीकृत किया जाता है कि एक फ़ंक्शन मौजूद है जो उपयोगकर्ता को जो भी डेटा संरचना चाहता है, परिणाम को परिवर्तित कर सकता है:
map :: IterableLike i ⇒ (a → b) → i → ([b] → c) → c
मैं मानता हूँ कि वाक्यविन्यास थोड़ा अव्यवस्थित है, लेकिन शब्दार्थ समान हैं। असल में, यह से शुरू होता है
def map[B](f: (A) ⇒ B): List[B]
जिसके लिए पारंपरिक हस्ताक्षर है map
। (नोट कैसे स्काला के वस्तु उन्मुख प्रकृति के कारण, इनपुट सूची पैरामीटर गायब हो जाती है, क्योंकि यह अब निहित रिसीवर पैरामीटर एक एकल प्रेषण OO सिस्टम में हर विधि पड़ता है।) तो यह एक ठोस से सामान्यीकृत List
एक अधिक सामान्य करने के लिएIterableLike
def map[B](f: (A) ⇒ B): IterableLike[B]
अब, यह IterableLike
परिणाम संग्रह को एक फ़ंक्शन के साथ बदलता है जो वास्तव में, किसी भी चीज़ के बारे में वास्तव में उत्पादन करता है।
def map[B, That](f: A ⇒ B)(implicit bf: CanBuildFrom[Repr, B, That]): That
जो मैं वास्तव में मानता हूं कि समझना मुश्किल नहीं है । वास्तव में केवल कुछ बौद्धिक उपकरण हैं जिनकी आपको आवश्यकता है:
- आपको यह जानना होगा (मोटे तौर पर) क्या
map
है। यदि आपने विधि के नाम के बिना केवल टाइप हस्ताक्षर दिए हैं , तो मैं मानता हूं कि यह पता लगाना बहुत कठिन होगा कि क्या चल रहा है। लेकिन जब से आप पहले से ही जानते हैं कि क्या map
करना है, और आप जानते हैं कि इसका प्रकार हस्ताक्षर क्या माना जाता है, आप जल्दी से हस्ताक्षर स्कैन कर सकते हैं और विसंगतियों पर ध्यान केंद्रित कर सकते हैं, जैसे "यह map
दो कार्यों को तर्क के रूप में क्यों लेता है, एक नहीं?"
- आपको वास्तव में टाइप सिग्नेचर पढ़ने में सक्षम होना चाहिए । लेकिन यहां तक कि अगर आपने पहले कभी स्काला को नहीं देखा है, तो यह काफी आसान होना चाहिए, क्योंकि यह वास्तव में सिर्फ एक प्रकार का सिंटैक्स है जो आप पहले से ही अन्य भाषाओं से जानते हैं: VB.NET पैरामीट्रिक बहुरूपता के लिए वर्ग कोष्ठक का उपयोग करता है, और एक तीर का उपयोग करने के लिए निरूपित करता है नाम और प्रकार को अलग करने के लिए वापसी प्रकार और एक बृहदान्त्र, वास्तव में आदर्श है।
- आपको मोटे तौर पर यह जानने की जरूरत है कि सामान्य प्रोग्रामिंग क्या है। (जो यह पता लगाने के लिए मुश्किल नहीं है , क्योंकि यह मूल रूप से नाम में वर्तनी है: यह सचमुच एक सामान्य फैशन में प्रोग्रामिंग है)।
इन तीनों में से किसी को भी कोई पेशेवर या यहां तक कि शौक़ीन प्रोग्रामर को गंभीर सिरदर्द नहीं देना चाहिए। map
पिछले 50 वर्षों में डिज़ाइन की गई हर भाषा में एक मानक कार्य किया गया है, इस तथ्य को कि अलग-अलग भाषाओं में अलग-अलग वाक्य-विन्यास हैं, उन सभी के लिए स्पष्ट होना चाहिए जिन्होंने HTML और CSS के साथ एक वेबसाइट डिज़ाइन की है और आप दूर से भी प्रोग्रामिंग की सदस्यता नहीं ले सकते। सेंट स्टीफानोव के चर्च से कुछ कष्टप्रद सी ++ फैनबॉय के बिना संबंधित मेलिंगलिस्ट जेनेरिक प्रोग्रामिंग के गुणों को समझाते हुए।
हाँ, स्काला है जटिल। हां, स्काला में सबसे परिष्कृत प्रकार की प्रणाली है जो मनुष्य को ज्ञात है, प्रतिद्वंद्वी और यहां तक कि हास्केल, मिरांडा, स्वच्छ या चक्रवात जैसी भाषाओं को पार करती है। लेकिन अगर एक प्रोग्रामिंग भाषा की सफलता के खिलाफ जटिलता एक तर्क थी, तो C ++ बहुत पहले ही मर गई होगी और हम सभी स्कीम लिख रहे होंगे। बहुत सारे कारण हैं कि स्काला बहुत सफल होने की संभावना नहीं है, लेकिन यह तथ्य कि प्रोग्रामर को कीबोर्ड के सामने बैठने से पहले अपने दिमाग को चालू करने के लिए परेशान नहीं किया जा सकता है, शायद मुख्य नहीं होगा।