एक प्रकार और एक प्रकार के बीच अंतर क्या है?


26

मैं प्रोग्रामिंग लैन्गॉज हास्केल सीख रहा हूं, और मैं एक typeऔर एक के बीच अंतर के बारे में अपना सिर लपेटने की कोशिश कर रहा हूं kind

जैसा कि मैंने यह समझते हैं, a kind is a type of type। उदाहरण के लिए, a ford is a type of carऔर a car is a kind of vehicle

क्या इस बारे में सोचने का यह एक अच्छा तरीका है?

क्योंकि, वर्तमान में मेरे मस्तिष्क को जिस तरह से तार दिया गया है ford is a **type** of car, लेकिन यह भी एक car is a **type** of vehicleही समय में एक है car is a **kind** of vehicle। यानी नियम typeऔर kindविनिमेय हैं।

क्या कोई इस पर कुछ प्रकाश डाल सकता है?


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

2
@ रॉबिनजिग्मंड: आप सही कह रहे हैं कि ये तकनीकी शब्द हैं, लेकिन इनका इस्तेमाल हास्केल में ज्यादा किया जाता है। हो सकता है कि स्टैक ओवरफ्लो चर्चा के लिए बैकलिंक इस सवाल को उठाता हो?
बेमिसाल बाउर

@AndrejBauer मैंने कभी नहीं कहा कि वे हास्केल के बाहर उपयोग नहीं किए गए थे, निश्चित रूप से "प्रकार" का उपयोग अनिवार्य रूप से हर भाषा में किया जाता है, जैसा कि मैंने कहा। मैं हास्केल के बाहर वास्तव में "दयालु" नहीं आया हूं, लेकिन तब हास्केल एकमात्र ऐसी कार्यात्मक भाषा है जिसे मैं बिल्कुल भी जानता हूं, और मुझे सावधान था कि यह शब्द कहीं और इस्तेमाल नहीं किया जाता है, बस इसे उस तरह से उपयोग किया जाता है हास्केल। (और लिंक, जैसा कि आप अनुरोध करते हैं, यहाँ है )
रॉबिन ज़िगमंड

एमएल-पारिवारिक भाषाओं में भी प्रकार होते हैं, उदाहरण के लिए मानक ML और OCaml। मुझे लगता है कि वे इस नाम से स्पष्ट नहीं हैं। वे हस्ताक्षर के रूप में प्रकट होते हैं , और उनके तत्वों को संरचना कहा जाता है
बाउर

1
एक अधिक सटीक अंग्रेजी सादृश्य फोर्ड एक प्रकार की कार है और कार एक प्रकार का वाहन है लेकिन कार-प्रकार और वाहन-प्रकार दोनों एक ही प्रकार के हैं: संज्ञाएं। जबकि लाल एक प्रकार का कार रंग है और RPM एक प्रकार का कार प्रदर्शन मेट्रिक्स है और दोनों एक ही प्रकार के हैं: विशेषण।
स्लीपबेटमैन

जवाबों:


32

यहां, "मान", "प्रकार", और "प्रकार" के औपचारिक अर्थ हैं, इसलिए ऑटोमोबाइल को वर्गीकृत करने के लिए उनके सामान्य अंग्रेजी उपयोग या उपमाओं पर विचार करना आपको केवल अब तक मिलेगा।

मेरा उत्तर विशेष रूप से हास्केल के संदर्भ में इन शब्दों के औपचारिक अर्थों से संबंधित है; ये अर्थ गणितीय / सीएस "प्रकार सिद्धांत" में प्रयुक्त अर्थों पर आधारित हैं (हालांकि वास्तव में समान नहीं हैं)। तो, यह एक बहुत अच्छा "कंप्यूटर विज्ञान" उत्तर नहीं होगा, लेकिन यह एक बहुत अच्छा हास्केल उत्तर के रूप में काम करना चाहिए।

हास्केल (और अन्य भाषाओं) में, यह एक प्रकार के प्रोग्राम एक्सप्रेशन को असाइन करने के लिए सहायक होता है, जिसमें उन मूल्यों के वर्ग का वर्णन होता है, जिनकी अभिव्यक्ति की अनुमति है। मैं यहां मानता हूं कि आपने यह समझने के लिए पर्याप्त उदाहरण देखे हैं कि यह जानना उपयोगी क्यों होगा कि अभिव्यक्ति में sqrt (a**2 + b**2), चर aऔर bहमेशा प्रकार के मान होंगे Doubleऔर नहीं, कहते हैं, Stringऔर Boolक्रमशः। असल में, टाइप करने से हमें अभिव्यक्ति / कार्यक्रमों को लिखने में सहायता मिलती है जो मूल्यों की एक विस्तृत श्रृंखला पर सही ढंग से काम करेंगे ।

अब, आप जो महसूस नहीं कर पाए हैं वह हैस्केल प्रकार, जैसे कि वे जो हस्ताक्षर में दिखाई देते हैं:

fmap :: Functor f => (a -> b) -> f a -> f b

वास्तव में स्वयं एक प्रकार के हास्केल उप भाषा में लिखे गए हैं। कार्यक्रम पाठ Functor f => (a -> b) -> f a -> f bहै - काफी शाब्दिक - एक प्रकार का अभिव्यक्ति जो इस उप भाषा में लिखा गया है। प्रांतीय भाषा ऑपरेटरों शामिल (जैसे, ->इस भाषा में एक सही साहचर्य इन्फ़िक्स ऑपरेटर है), चर (जैसे, f, a, और b), और किसी अन्य के लिए एक प्रकार अभिव्यक्ति की "आवेदन" (जैसे, f aहै fकरने के लिए लागू a)।

क्या मैंने उल्लेख किया कि अभिव्यक्ति मूल्यों के वर्गों का वर्णन करने के लिए कार्यक्रम के प्रकारों को निर्दिष्ट करने के लिए कई भाषाओं में यह कैसे सहायक था? खैर, इस प्रकार-स्तरीय उप-भाषा में, अभिव्यक्तियाँ प्रकारों का मूल्यांकन करती हैं ( मूल्यों के बजाय ) और यह उन प्रकारों के वर्गों का वर्णन करने के लिए प्रकारों को निर्दिष्ट करने के लिए सहायक होता है, जिनका वे प्रतिनिधित्व करने की अनुमति देते हैं। असल में, होने प्रकार प्रकार भाव है कि सही ढंग से की एक विस्तृत श्रृंखला से अधिक काम करेंगे लेखन में हमारी मदद प्रकार

तो, मान रहे हैं प्रकार के रूप में प्रकार के लिए कर रहे हैं प्रकार , और प्रकार हमें लिखने में मदद मूल्य स्तर के कार्यक्रमों जबकि प्रकार हमें लिखने में मदद प्रकार स्तर के कार्यक्रम।

ये किस प्रकार के दिखते हैं? खैर, हस्ताक्षर पर विचार करें:

id :: a -> a

प्रकार अभिव्यक्ति तो a -> aमान्य होने के लिए है, क्या तरह के प्रकार हम चर की अनुमति चाहिए aहोने के लिए? खैर, प्रकार के भाव:

Int -> Int
Bool -> Bool

मान्य देखो, इसलिए प्रकार Int और Boolस्पष्ट रूप से सही प्रकार के हैं । लेकिन और भी जटिल प्रकार जैसे:

[Double] -> [Double]
Maybe [(Double,Int)] -> Maybe [(Double,Int)]

वैध देखो। वास्तव में, चूंकि हमें idफ़ंक्शन पर कॉल करने में सक्षम होना चाहिए , यहां तक ​​कि:

(a -> a) -> (a -> a)

ठीक लग रहा है। तो, Int, Bool, [Double], Maybe [(Double,Int)], और a -> aकी तरह सभी देखो प्रकार के अधिकार के तरह

दूसरे शब्दों में, ऐसा लगता है कि केवल एक ही प्रकार है , चलो इसे *यूनिक्स वाइल्डकार्ड की तरह कहते हैं , और हर प्रकार का एक ही प्रकार है * , कहानी का अंत।

सही?

खैर, काफी नहीं। यह पता चला है कि Maybe, सभी अपने आप में, बस एक प्रकार की अभिव्यक्ति के रूप में मान्य है Maybe Int(उसी तरह sqrt, सभी अपने आप में, बस के रूप में मान्य मूल्य अभिव्यक्ति के रूप में मान्य है sqrt 25)। हालाँकि , निम्न प्रकार की अभिव्यक्ति मान्य नहीं है:

Maybe -> Maybe

क्योंकि, Maybeएक प्रकार की अभिव्यक्ति है, यह उस प्रकार के प्रकार का प्रतिनिधित्व नहीं करता है जिसमें मान हो सकते हैं। तो, कि हम कैसे परिभाषित करना चाहिए *- यह है प्रकार के प्रकार है कि मूल्यों; ऐसा लगता है कि "पूर्ण" प्रकार शामिल हैं Doubleया Maybe [(Double,Int)]लेकिन शामिल नहीं अधूरा, मूल्यहीन प्रकार की तरह है Either String। सादगी के लिए, मैं इन पूर्ण प्रकारों को *"ठोस प्रकार" कहूंगा , हालांकि यह शब्दावली सार्वभौमिक नहीं है, और "कंक्रीट प्रकार" का मतलब कुछ अलग हो सकता है, जैसे कि, C ++ प्रोग्रामर।

अब, प्रकार अभिव्यक्ति में a -> a, जब तक प्रकार के रूप में aहै प्रकार * (ठोस प्रकार की तरह), प्रकार अभिव्यक्ति का परिणाम a -> aहोगा भी है प्रकार * (यानी, ठोस प्रकार की तरह)।

तो, किस प्रकार का प्रकार है Maybe? खैर, Maybeएक ठोस प्रकार के लिए लागू किया जा सकता है एक और ठोस प्रकार उपज। तो, Maybeएक प्रकार स्तरीय समारोह है कि एक लेता है की तरह एक छोटे से की तरह दिखता है प्रकार की तरह * है और एक रिटर्न प्रकार की तरह * । अगर हम एक मूल्य के स्तर समारोह है कि एक ले लिया था मूल्य के प्रकार Int और एक लौटे मूल्य के प्रकार Int , हम इसे एक देना चाहते हैं प्रकार हस्ताक्षर Int -> Int, तो सादृश्य द्वारा हम देना चाहिए Maybeएक तरह हस्ताक्षर * -> *। GHCi इससे सहमत है:

> :kind Maybe
Maybe :: * -> *

को वापस जा रहा:

fmap :: Functor f => (a -> b) -> f a -> f b

इस प्रकार के हस्ताक्षर में, चर fप्रकार * -> *और चर होते हैं aऔर bदयालु होते हैं *; बिल्ट-इन ऑपरेटर के ->पास दयालु होता है * -> * -> *(यह *बाईं तरफ एक प्रकार का होता है और दाईं ओर एक प्रकार का होता है और एक प्रकार का भी रिटर्न देता है *) इस प्रकार के नियमों से, आप यह मान सकते हैं कि a -> bयह एक प्रकार का मान्य प्रकार है *, f aऔर f bयह भी प्रकार के साथ मान्य प्रकार हैं *, और (a -> b) -> f a -> f bमान्य प्रकार का है *

दूसरे शब्दों में, संकलक (a -> b) -> f a -> f bयह सत्यापित करने के लिए टाइप अभिव्यक्ति को "टाइप" sqrt (a**2 + b**2)कर सकता है कि यह सही प्रकार के चर के लिए मान्य है जिस तरह से यह "टाइप चेक" यह सत्यापित करने के लिए कि यह सही प्रकार के चर के लिए मान्य है।

"प्रकार" बनाम "प्रकार" के लिए अलग-अलग शब्दों का उपयोग करने का कारण (यानी, "प्रकार के प्रकारों के बारे में बात नहीं करना) ज्यादातर भ्रम से बचने के लिए है। प्रकार बहुत से अलग लग रहे ऊपर प्रकार कम से कम पहली बार में और, काफी अलग तरीके से व्यवहार करने लगते हैं। (उदाहरण के लिए, यह विचार हर "सामान्य" प्रकार एक ही तरह है कि चारों ओर अपने सिर रैप करने के लिए कुछ समय लगता है *और जिस तरह का a -> bहै *नहीं * -> *।)

इसमें से कुछ ऐतिहासिक भी है। जैसा कि जीएचसी हास्केल विकसित हुआ है, मूल्यों, प्रकारों और प्रकारों के बीच के अंतर धुंधले होने लगे हैं। इन दिनों, मूल्यों को "प्रचारित" प्रकारों में किया जा सकता है, और प्रकार और प्रकार वास्तव में एक ही चीज हैं। तो, आधुनिक हास्केल में, मूल्यों दोनों प्रकार है और हैं प्रकार (लगभग), और प्रकार के प्रकार के सिर्फ अधिक प्रकार के होते हैं।

@ user21820 ने "प्रकार और प्रकार वास्तव में एक ही चीज हैं" के कुछ अतिरिक्त स्पष्टीकरण के लिए कहा। थोड़ा स्पष्ट होने के लिए, आधुनिक जीएचसी हास्केल में (संस्करण 8.0.1 के बाद से, मुझे लगता है), प्रकार और प्रकार के अधिकांश संकलक कोड में समान रूप से व्यवहार किया जाता है । संकलक त्रुटि संदेशों में "प्रकार" और "प्रकार" के बीच अंतर करने के लिए कुछ प्रयास करता है, यह इस बात पर निर्भर करता है कि क्या यह मूल्य के प्रकार या क्रमशः प्रकार के बारे में शिकायत कर रहा है।

इसके अलावा, यदि कोई एक्सटेंशन सक्षम नहीं हैं, तो वे आसानी से सतह की भाषा में अंतर कर सकते हैं। उदाहरण के लिए, प्रकार (मानों का) वाक्य रचना में एक प्रतिनिधित्व है (जैसे, प्रकार के हस्ताक्षर में), लेकिन प्रकार (प्रकार के) हैं - मुझे लगता है - पूरी तरह से निहित है, और जहां वे दिखाई देते हैं वहां कोई स्पष्ट वाक्यविन्यास नहीं है।

लेकिन, यदि आप उपयुक्त एक्सटेंशन को चालू करते हैं, तो प्रकार और प्रकार के बीच का अंतर काफी हद तक गायब हो जाता है। उदाहरण के लिए:

{-# LANGUAGE GADTs, TypeInType #-}
data Foo where
  Bar :: Bool -> * -> Foo

यहाँ, Barएक मूल्य (और दोनों) एक प्रकार है। एक प्रकार के रूप में, इसका प्रकार Bool -> * -> Fooएक प्रकार का स्तर है , जो एक प्रकार का प्रकार लेता है Bool(जो एक प्रकार है, लेकिन यह भी एक प्रकार है) और एक प्रकार का प्रकार है *और एक प्रकार का प्रकार पैदा करता है Foo। इसलिए:

type MyBar = Bar True Int

सही तरह से जाँच।

जैसा कि @AndrejBauer अपने उत्तर में बताते हैं, प्रकार और प्रकार के बीच अंतर करने की यह विफलता असुरक्षित है - एक प्रकार / प्रकार *जिसका प्रकार / प्रकार स्वयं (जो कि आधुनिक हास्केल में मामला है) होने के कारण विरोधाभास होता है। हालांकि, हास्केल का प्रकार प्रणाली पहले ही गैर-समाप्ति के कारण विरोधाभासों से भरा है, इसलिए इसे बड़ी बात नहीं माना जाता है।


यदि "प्रकार और प्रकार वास्तव में एक ही चीज हैं", तो इसका प्रकार typeकेवल typeस्वयं है, और इसके लिए कोई आवश्यकता नहीं होगी kind। तो क्या अंतर है?
user21820

1
@ user21820, मैंने अंत में एक नोट जोड़ा जो इसे संबोधित कर सकता है। संक्षिप्त उत्तर: आधुनिक जीएचसी हास्केल में वास्तव में कोई अंतर नहीं है ।
केए बुहर

1
यह एक शानदार जवाब है - साझा करने के लिए बहुत बहुत धन्यवाद। यह अच्छी तरह से लिखा गया है और धीरे-धीरे अवधारणाओं का परिचय देता है - जैसा कि कुछ वर्षों के लिए हास्केल ने नहीं लिखा है, यह बहुत सराहना की है!
ultrafez

@KABuhr: उस जोड़े के लिए धन्यवाद बिट!
user21820

19

type:kind=set:class

  • Bool एक प्रकार है
  • Type एक प्रकार है क्योंकि इसके तत्व प्रकार हैं
  • Bool -> Int एक प्रकार है
  • Bool -> Type एक प्रकार है क्योंकि इसके तत्व प्रकार हैं जो प्रकार लौटते हैं
  • Bool * Int एक प्रकार है
  • Bool * Type एक प्रकार है क्योंकि इसके तत्व एक प्रकार के घटक के साथ जोड़े हैं

U0U1U2U0BoolNatNatNatU1U0BoolU0U0U0Un+1UnUn×

U0U1U0U1U0**U_1


2
मुझे नहीं लगता (GHC) हास्केल के पास ब्रह्मांड की कोई अवधारणा है। Type :: Typeएक स्वयंसिद्ध है। "प्रकार" और "दयालु" के बीच का अंतर पूरी तरह से मानव भाषा में है, उस मामले में। Trueएक प्रकार है, Boolऔर Boolएक प्रकार है Type, जो खुद प्रकार है Type। कभी-कभी हम एक प्रकार को एक प्रकार कहते हैं, इस बात पर जोर देने के लिए कि यह एक प्रकार-स्तरीय इकाई का प्रकार है, लेकिन, हास्केल में, यह अभी भी एक प्रकार है। ऐसी प्रणाली में जहां वास्तव में ब्रह्मांड मौजूद हैं, जैसे कि कोक, फिर "प्रकार" एक ब्रह्मांड को संदर्भित कर सकता है और दूसरे को "तरह", लेकिन फिर हम आमतौर पर असीम रूप से कई ब्रह्मांड चाहते हैं।
HTNW

1
भेद केवल "मानव भाषा" नहीं है, यह अंतर्निहित प्रकार प्रणाली में एक औपचारिक अंतर है। दोनों Type :: Typeप्रकार और प्रकारों के बीच अंतर करना काफी संभव है । इसके अलावा, Type :: Typeहास्केल में कौन सा कोड प्रदर्शित करता है?
लेडी बाउर

1
मुझे यह भी कहना चाहिए कि *हास्केल एक प्रकार का एक ब्रह्मांड है। वे सिर्फ यह नहीं कहते हैं कि।
लेडी बाउर

3
@AndrejBauer Typeसे Data.Kindsऔर *समानार्थी होना चाहिए। प्रारंभ में हमारे पास केवल *एक आदिम के रूप में था , जबकि आजकल आंतरिक रूप GHC.Types.Typeसे आंतरिक मॉड्यूल के रूप में परिभाषित किया गया है GHC.Types, बदले में परिभाषित किया गया है type Type = TYPE LiftedRep। मुझे लगता TYPEहै कि वास्तविक आदिम है, प्रकार के एक परिवार (उठा प्रकार, अनबॉक्स प्रकार, ...) प्रदान करता है। यहां अधिकांश "इनलेगेंट" जटिलता कुछ निम्न-स्तरीय अनुकूलन का समर्थन करने के लिए है, न कि वास्तविक प्रकार के सिद्धांतिक कारणों के लिए।
चि

1
मैं संक्षेप में बताने की कोशिश करूँगा। यदि vएक मूल्य है, तो इसका एक प्रकार है v :: T:। यदि Tएक प्रकार है, तो इसका एक प्रकार है T :: K:। प्रकार के प्रकार को इसका प्रकार कहा जाता है। प्रकार जो दिखते हैं TYPE repउन्हें सॉर्ट कहा जा सकता है, हालांकि यह शब्द असामान्य है। Iff T :: TYPE repको TRHS a पर प्रदर्शित होने की अनुमति है ::। शब्द "प्रकार" इसे करने के लिए अति सूक्ष्म अंतर है: Kमें T :: Kएक तरह का है, लेकिन नहीं में v :: K, हालांकि यह एक ही है K। हम परिभाषित कर सकते हैं " Kएक प्रकार है अगर इसकी तरह एक प्रकार" उर्फ ​​"प्रकार आरएचएस पर हैं ::", लेकिन यह उपयोग को सही ढंग से कैप्चर नहीं करता है। इसलिए मेरी "मानव भेद" स्थिति।
HTNW

5

एक मान उस विशिष्ट लाल 2011 फोर्ड मस्टैंग की तरह है जिस पर 19,206 मील की दूरी पर आप अपने ड्राइववे में बैठे हैं।

यह विशिष्ट मूल्य, अनौपचारिक रूप से, कई प्रकार हो सकते हैं : यह एक मस्तंग है, और यह एक फोर्ड है, और यह एक कार है, और यह एक वाहन है, कई अन्य प्रकारों के बीच जो आप बना सकते हैं (प्रकार की) चीजें आप से संबंधित हैं ", या" लाल हैं "या" ... के प्रकार।

(हास्केल में, पहले क्रम में सन्निकटन (GADTs इस संपत्ति को तोड़ता है, और संख्या शाब्दिक और जादू के आसपास का जादू इसे थोड़ा बढ़ा देता है), मूल्यों में अनौपचारिक "प्रकार" के ढेरों के बजाय एक प्रमुख प्रकार है जो आप अपने 'दे सकते हैं' 42इस स्पष्टीकरण के प्रयोजनों के लिए स्टैंग है, (, Int"संख्या" या "यहां तक ​​कि पूर्णांकों" के लिए हास्केल में कोई प्रकार नहीं है-बल्कि, आप एक बना सकते हैं, लेकिन यह एक प्रकार से निराशाजनक प्रकार होगा Int।)

अब, "मस्टैंग" "कार" का एक उप-प्रकार हो सकता है -प्रत्येक मूल्य एक मस्टैंग भी एक कार है। लेकिन टाइप -ओ, हास्केल की शब्दावली का उपयोग करने के लिए, "मस्टैंग" का प्रकार "कार" नहीं है। "मस्टैंग" प्रकार वह चीज नहीं है जिसे आप अपने ड्राइववे में पार्क कर सकते हैं या चारों ओर ड्राइव कर सकते हैं। "मस्टैंग" एक संज्ञा, या एक श्रेणी या सिर्फ एक प्रकार है। वे, अनौपचारिक रूप से, "मस्टैंग" के प्रकार हैं।

(फिर से, हास्केल केवल प्रत्येक प्रकार-स्तरीय चीज़ के लिए एक प्रकार को पहचानता है। इसलिए Intदयालु है *, और कोई अन्य प्रकार नहीं है। Maybeदयालु है * -> *, और कोई अन्य प्रकार नहीं है। लेकिन अंतर्ज्ञान अभी भी धारण करना चाहिए: 42एक है Int, और आप Intइसके साथ y चीजें कर सकते हैं। । जोड़ने और घटाने की तरह Intही एक नहीं है Int, वहाँ जैसी कोई संख्या है Int + Intआप अनौपचारिक रूप से सुन सकते हैं लोग कहते हैं कि। Intएक है Num, जिसके द्वारा वे मतलब एक है कि वहाँ उदाहरण के Numप्रकार वर्ग के लिए प्रकार Int-इस एक ही बात नहीं है कह रही है कि के रूप में Intहै तरह NumIntप्रकार "प्रकार" है, जो हास्केल में लिखा जाता है है *।)

तो क्या हर अनौपचारिक "प्रकार" सिर्फ एक संज्ञा या एक श्रेणी नहीं है? क्या सभी प्रकार एक ही तरह के होते हैं? अगर वे बहुत उबाऊ हैं तो हर तरह की बात क्यों करें?

यह वह जगह है जहां अंग्रेजी सादृश्य थोड़ा चट्टानी हो जाएगा, लेकिन मेरे साथ सहन करें: दिखावा करें कि अंग्रेजी में "मालिक" शब्द का कोई मतलब नहीं है, स्वामित्व का कोई विवरण नहीं है। बहाना करें कि अगर कोई आपको "मालिक" कहता है, तो इससे आपको कोई मतलब नहीं होगा; लेकिन अगर कोई आपको "कार का मालिक" कहता है, तो आप समझ सकते हैं कि उनका क्या मतलब है।

"मालिक" के पास "कार" के समान प्रकार नहीं है, क्योंकि आप एक कार के बारे में बात कर सकते हैं, लेकिन आप अंग्रेजी के इस संस्करण में एक मालिक के बारे में बात नहीं कर सकते। आप केवल "कार के मालिक" के बारे में बात कर सकते हैं। "स्वामी" केवल कुछ प्रकार की "संज्ञा" बनाता है, जब यह उस चीज़ पर लागू होता है जिसमें पहले से ही "संज्ञा" होती है, जैसे "कार"। हम कहेंगे कि "स्वामी" का प्रकार "संज्ञा -> संज्ञा" है। "मालिक" एक फ़ंक्शन की तरह है जो एक संज्ञा लेता है और एक अलग संज्ञा से उत्पन्न होता है; लेकिन यह स्वयं संज्ञा नहीं है।

ध्यान दें कि "कार मालिक" "कार" का उपप्रकार नहीं है! यह एक ऐसा कार्य नहीं है जो कारों को स्वीकार या लौटाता है! यह "कार" से बिल्कुल अलग प्रकार का है। यह दो हथियारों और दो पैरों के साथ मूल्यों का वर्णन करता है, जिनके पास एक बिंदु पर एक निश्चित राशि थी, और उस पैसे को डीलरशिप पर ले गए। इसमें उन मानों का वर्णन नहीं किया गया है जिनमें चार पहिए और पेंट का काम है। यह भी ध्यान दें कि "कार के मालिक" और "कुत्ते के मालिक" अलग-अलग प्रकार के हैं, और जो चीजें आप एक के साथ करना चाहते हैं, वह दूसरे पर लागू नहीं हो सकती है।

(इसी तरह, जब हम कहते हैं कि हास्केल में Maybeदयालुता * -> *है, तो हमारा मतलब है कि यह निरर्थक है (औपचारिक रूप से; अनौपचारिक रूप से हम इसे हर समय करते हैं) "ए Maybe" होने के बारे में बात करने के लिए । इसके बजाय, हम एक Maybe Intया एक हो सकते हैं Maybe String, क्योंकि वे चीजें हैं। दयालु *)

तो सभी प्रकार के बारे में बात करने का पूरा बिंदु यह है कि हम "मालिक" जैसे शब्दों के आसपास अपने तर्क को औपचारिक रूप दे सकें और यह लागू कर सकें कि हम केवल उन प्रकारों के मूल्यों को लेते हैं जो "पूरी तरह से निर्मित" हुए हैं और निरर्थक नहीं हैं।


1
मैं यह नहीं कह रहा हूं कि आपकी उपमा गलत है, लेकिन मुझे लगता है कि इससे भ्रम पैदा हो सकता है। दिक्जस्त्र में उपमाओं के बारे में कुछ शब्द हैं। Google "वास्तव में कंप्यूटिंग विज्ञान पढ़ाने की क्रूरता पर"।
राफेल कास्त्रो

मेरा मतलब है, कार एनालॉग्स हैं, और फिर कार एनालॉग्स हैं। मुझे नहीं लगता है कि एक प्राकृतिक भाषा में निहित प्रकार की संरचना को उजागर करना (जो, माना जाता है, मैंने दूसरी छमाही में खिंचाव किया था) एक औपचारिक प्रकार की प्रणाली को समझाने के तरीके के रूप में शिक्षण के माध्यम से उसी तरह की बात कर रही है जैसे कि सादृश्य के बारे में बात करना एक कार्यक्रम "क्या" करना चाहता है।
user11228628

1

जैसा कि मैं इसे समझता हूं, एक प्रकार का एक प्रकार है।

यह सही है - तो आइए जानें कि इसका क्या मतलब है। Intया Textठोस प्रकार हैं, लेकिन Maybe aएक अमूर्त प्रकार है। यह तब तक एक ठोस प्रकार नहीं बन जाएगा, जब तक आप यह नहीं तय करते हैं कि आप aकिसी विशेष चर (या मूल्य / अभिव्यक्ति / जो भी) के लिए क्या विशिष्ट मूल्य चाहते हैं Maybe Text

हम कहते हैं कि Maybe aएक प्रकार का कंस्ट्रक्टर है क्योंकि यह एक फ़ंक्शन की तरह है जो एक ठोस प्रकार (जैसे Text) लेता है और एक ठोस प्रकार ( Maybe Textइस मामले में) लौटाता है । लेकिन अन्य प्रकार के कंस्ट्रक्टर कंक्रीट प्रकार को वापस करने से पहले और भी अधिक "इनपुट परम" ले सकते हैं। जैसे Map k vदो ठोस प्रकार (उदाहरण के लिए लेने की जरूरत Intऔर Text) इससे पहले कि यह एक ठोस प्रकार का निर्माण कर सकते ( Map Int Text)।

इसलिए, Maybe aऔर List aटाइप कंस्ट्रक्टर्स के पास एक ही "हस्ताक्षर" होता है जिसे हम * -> *(हस्केल फ़ंक्शन हस्ताक्षर के समान) के रूप में दर्शाते हैं क्योंकि यदि आप उन्हें एक ठोस प्रकार देते हैं तो वे एक ठोस प्रकार को थूक देंगे। हम इस प्रकार के और "प्रकार" कहते हैं Maybeऔर Listएक ही तरह की है।

कंक्रीट प्रकारों को दयालु कहा जाता है *, और हमारा मानचित्र उदाहरण दयालु है * -> * -> *क्योंकि यह दो ठोस प्रकारों को इनपुट के रूप में लेता है इससे पहले कि यह एक ठोस प्रकार का उत्पादन कर सकता है।

आप इसे देख सकते हैं ज्यादातर बस "पैरामीटर" है कि हम प्रकार निर्माता करने के लिए पारित की संख्या के बारे में - लेकिन पता है कि हम भी प्रकार कंस्ट्रक्टर्स प्रकार कंस्ट्रक्टर्स अंदर नेस्टेड हो सकता है, इसलिए हम एक प्रकार के साथ खत्म हो सकता है कि जैसी लगती है * -> (* -> *) -> *, उदाहरण के लिए ।

यदि आप एक स्काला / जावा देव हैं, तो आपको यह स्पष्टीकरण सहायक भी लग सकता है: https://www.atlassian.com/blog/archives/scala-types-of-a-higher-kind


यह सही नहीं है। हास्केल में, हम Maybe a, एक पर्यायवाची forall a. Maybe a, एक बहुरूपी प्रकार *, और Maybe, एक मोनोमोर्फिक प्रकार के बीच अंतर करते हैं * -> *
b0fh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.