यहां, "मान", "प्रकार", और "प्रकार" के औपचारिक अर्थ हैं, इसलिए ऑटोमोबाइल को वर्गीकृत करने के लिए उनके सामान्य अंग्रेजी उपयोग या उपमाओं पर विचार करना आपको केवल अब तक मिलेगा।
मेरा उत्तर विशेष रूप से हास्केल के संदर्भ में इन शब्दों के औपचारिक अर्थों से संबंधित है; ये अर्थ गणितीय / सीएस "प्रकार सिद्धांत" में प्रयुक्त अर्थों पर आधारित हैं (हालांकि वास्तव में समान नहीं हैं)। तो, यह एक बहुत अच्छा "कंप्यूटर विज्ञान" उत्तर नहीं होगा, लेकिन यह एक बहुत अच्छा हास्केल उत्तर के रूप में काम करना चाहिए।
हास्केल (और अन्य भाषाओं) में, यह एक प्रकार के प्रोग्राम एक्सप्रेशन को असाइन करने के लिए सहायक होता है, जिसमें उन मूल्यों के वर्ग का वर्णन होता है, जिनकी अभिव्यक्ति की अनुमति है। मैं यहां मानता हूं कि आपने यह समझने के लिए पर्याप्त उदाहरण देखे हैं कि यह जानना उपयोगी क्यों होगा कि अभिव्यक्ति में 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 अपने उत्तर में बताते हैं, प्रकार और प्रकार के बीच अंतर करने की यह विफलता असुरक्षित है - एक प्रकार / प्रकार *
जिसका प्रकार / प्रकार स्वयं (जो कि आधुनिक हास्केल में मामला है) होने के कारण विरोधाभास होता है। हालांकि, हास्केल का प्रकार प्रणाली पहले ही गैर-समाप्ति के कारण विरोधाभासों से भरा है, इसलिए इसे बड़ी बात नहीं माना जाता है।