मुझे कुछ असमंजस के साथ पिच करके इस भ्रम को शुरू करने के लिए तैयार करना है। मैं इसे समझाने के लिए सादृश्य स्तर से मूल्य स्तर तक का उपयोग करना पसंद करता हूं, क्योंकि लोग इसके बारे में अधिक परिचित हैं।
एक प्रकार का कंस्ट्रक्टर एक प्रकार है जिसे आप टाइप करने के लिए तर्क टाइप करने के लिए आवेदन कर सकते हैं।
एक वैल्यू कंस्ट्रक्टर एक वैल्यू है जिसे आप वेल्यू "कंस्ट्रक्शन" करने के लिए वैल्यू आर्ग्यूमेंट्स पर अप्लाई कर सकते हैं।
मूल्य निर्माणकर्ताओं को आमतौर पर "फ़ंक्शन" या "तरीके" कहा जाता है। इन "कंस्ट्रक्टर्स" को "पॉलीमॉर्फिक" भी कहा जाता है (क्योंकि इनका उपयोग "अलग-अलग" आकार "के" सामान "के निर्माण के लिए किया जा सकता है), या" एब्स्ट्रक्शन "(क्योंकि वे अलग-अलग पॉलीमोर्फिक इंस्टीमेंट्स के बीच भिन्न होते हैं)।
अमूर्त / बहुरूपता के संदर्भ में, पहले-क्रम में अमूर्तता के "एकल उपयोग" को संदर्भित किया जाता है: आप एक बार एक प्रकार से अधिक सार करते हैं, लेकिन वह प्रकार स्वयं किसी भी चीज़ पर सार नहीं कर सकता है। जावा 5 जेनरिक फर्स्ट-ऑर्डर हैं।
अमूर्तता के उपरोक्त लक्षण वर्णन की पहली-क्रम व्याख्या है:
एक प्रकार का निर्माणकर्ता एक प्रकार है जिसे आप उचित प्रकार के "निर्माण" के लिए उचित प्रकार के तर्कों पर लागू कर सकते हैं।
एक वैल्यू कंस्ट्रक्टर एक ऐसा मूल्य है जिसे आप उचित मान के "कंस्ट्रक्शन" करने के लिए उचित मूल्य के तर्क पर लागू कर सकते हैं।
इस बात पर जोर देने के लिए कि इसमें कोई अमूर्तता शामिल नहीं है (मुझे लगता है कि आप इसे "शून्य-ऑर्डर" कह सकते हैं, लेकिन मैंने इसे कहीं भी उपयोग नहीं किया है), जैसे कि मूल्य 1
या प्रकार String
, हम आमतौर पर कहते हैं कि कुछ "उचित" मान या प्रकार है।
एक उचित मूल्य इस अर्थ में "तुरंत प्रयोग करने योग्य" है कि वह तर्कों का इंतजार नहीं कर रहा है (यह उनके ऊपर सार नहीं है)। उन्हें उन मूल्यों के रूप में सोचें जिन्हें आप आसानी से प्रिंट / निरीक्षण कर सकते हैं (एक फ़ंक्शन को धोखा देना धारावाहिक है!)।
एक उचित प्रकार एक प्रकार है जो मानों को वर्गीकृत करता है (वैल्यू कंस्ट्रक्टर सहित), टाइप कंस्ट्रक्टर किसी भी मान को वर्गीकृत नहीं करते हैं (उन्हें एक उचित प्रकार प्राप्त करने के लिए सही प्रकार के तर्कों पर लागू होने की आवश्यकता होती है)। एक प्रकार को तुरंत करने के लिए, यह आवश्यक है (लेकिन पर्याप्त नहीं) कि यह एक उचित प्रकार हो। (यह एक अमूर्त वर्ग या एक वर्ग हो सकता है, जिसकी आपके पास पहुँच नहीं है।)
"उच्च-क्रम" बस एक सामान्य शब्द है जिसका अर्थ है बार-बार बहुरूपता / अमूर्त का उपयोग। इसका अर्थ बहुरूपी प्रकारों और मूल्यों के लिए समान है। इसके विपरीत, एक उच्च-क्रम अमूर्त अमूर्त चीज पर कुछ सार करता है। प्रकारों के लिए, "उच्च-किन्नर" शब्द अधिक सामान्य "उच्च-क्रम" का एक विशेष-उद्देश्यीय संस्करण है।
इस प्रकार, हमारे लक्षण वर्णन का उच्च-क्रम संस्करण बन जाता है:
एक प्रकार का कंस्ट्रक्टर एक प्रकार है जिसे आप एक उचित प्रकार (कंस्ट्रक्टर) बनाने के लिए तर्क (उचित प्रकार या टाइप कंस्ट्रक्टर) पर लागू कर सकते हैं।
वैल्यू कंस्ट्रक्टर एक वैल्यू है जिसे आप वैल्यू आर्ग्यूमेंट (उचित मान या वैल्यू कंस्ट्रक्टर) पर लागू करके "वैल्यू" को एक उचित वैल्यू (कंस्ट्रक्टर) पर लागू कर सकते हैं।
इस प्रकार, "उच्च-क्रम" का सीधा मतलब यह है कि जब आप "एक्स पर अमूर्त" कहते हैं, तो आप वास्तव में इसका मतलब है! X
कर सकते हैं सार यह सब यह चाहता है: अधिक निकाला है कि है अपने स्वयं के "अमूर्त अधिकार" खोना नहीं करता। (वैसे, मैं यहां "अमूर्त" क्रिया का उपयोग करता हूं, जिसका अर्थ है: किसी ऐसी चीज को छोड़ने के लिए जो मूल्य या प्रकार की परिभाषा के लिए आवश्यक नहीं है, ताकि यह एक तर्क के रूप में अमूर्त के उपयोगकर्ता द्वारा विविध / प्रदान किया जा सके। ।)
यहाँ कुछ उदाहरण हैं (ईमेल द्वारा लुत्ज़ के सवालों से प्रेरित) उचित, प्रथम-क्रम और उच्च-क्रम मान और प्रकार:
proper first-order higher-order
values 10 (x: Int) => x (f: (Int => Int)) => f(10)
types (classes) String List Functor
types String ({type λ[x] = x})#λ ({type λ[F[x]] = F[String]})#λ
जहाँ प्रयुक्त वर्गों को परिभाषित किया गया था:
class String
class List[T]
class Functor[F[_]]
परिभाषित करने वाली कक्षाओं के माध्यम से अप्रत्यक्ष रूप से बचने के लिए, आपको किसी तरह अनाम कार्यों को व्यक्त करने की आवश्यकता है, जो सीधे स्काला में व्यक्त नहीं हैं, लेकिन आप संरचनात्मक प्रकारों का उपयोग बहुत अधिक सिंथैटिक ओवरहेड के बिना कर सकते हैं ( #λ
-स्टाइल https://stackoverflow.com के कारण है) / उपयोगकर्ता / 160378 / पूर्वव्यापी afaik):
गुमनाम प्रकार के कार्यों का समर्थन करने वाले स्काला के कुछ काल्पनिक भविष्य के संस्करण में, आप उदाहरणों से अंतिम पंक्ति को छोटा कर सकते हैं:
types (informally) String [x] => x [F[x]] => F[String]) // I repeat, this is not valid Scala, and might never be
(एक व्यक्तिगत टिप्पणी पर, मुझे कभी भी "उच्च-प्रकार के प्रकारों" के बारे में बात करने पर पछतावा होता है, वे सभी प्रकार के होते हैं! जब आपको पूरी तरह से अवहेलना करने की आवश्यकता होती है, तो मैं आपको "टाइप कंस्ट्रक्टर पैरामीटर", "टाइप कंस्ट्रक्टर सदस्य" जैसी बातें कहने का सुझाव देता हूं। , या "टाइप कंस्ट्रक्टर उर्फ", इस बात पर जोर देने के लिए कि आप केवल उचित प्रकारों के बारे में बात नहीं कर रहे हैं।)
पीएस: आगे के मामलों को जटिल करने के लिए, "पॉलीमॉर्फिक" एक अलग तरीके से अस्पष्ट है, क्योंकि एक पॉलीमॉर्फिक प्रकार का मतलब कभी-कभी एक सार्वभौमिक रूप से निर्धारित प्रकार होता है, जैसे कि Forall T, T => T
, यह एक उचित प्रकार है, क्योंकि यह पॉलिफ़िक मानों को वर्गीकृत करता है (स्काला में, यह मान हो सकता है) संरचनात्मक प्रकार के रूप में लिखा {def apply[T](x: T): T = x}
)