प्रथम श्रेणी के प्रकार आश्रित टाइपिंग नामक कुछ को सक्षम करते हैं । ये प्रोग्रामर को टाइप स्तर पर मानों का उपयोग करने की अनुमति देते हैं। उदाहरण के लिए, पूर्णांकों के सभी युग्मों का प्रकार एक नियमित प्रकार है, जबकि सभी पूर्णांकों की जोड़ी बाईं संख्या से दाईं संख्या की तुलना में छोटी एक आश्रित प्रकार है। इस का मानक परिचयात्मक उदाहरण लंबाई एन्कोडेड सूचियों (आमतौर पर Vector
हास्केल / इदरिस में कहा जाता है) है। निम्नलिखित छद्म कोड इदरिस और हास्केल का मिश्रण है।
-- a natural number
data Nat = Zero | Successor Nat
data Vector length typ where
Empty : Vector Zero typ
(::) : typ -> Vector length typ -> Vector (Successor length) typ
कोड का यह टुकड़ा हमें दो बातें बताता है:
- खाली सूची की लंबाई शून्य है।
cons
किसी सूची में एक तत्व को सम्मिलित करना लंबाई की एक सूची बनाता है n + 1
यह 0 के साथ एक और अवधारणा के समान दिखता है n + 1
, है ना? मैं उसी पर वापस आता हूँ।
इससे हमें क्या हासिल होता है? अब हम अपने द्वारा उपयोग किए जाने वाले कार्यों के अतिरिक्त गुणों को निर्धारित कर सकते हैं। उदाहरण के लिए: एक महत्वपूर्ण संपत्ति append
यह है कि परिणामी सूची की लंबाई दो तर्क सूचियों की लंबाई का योग है:
plus : Nat -> Nat -> Nat
plus Zero n = n
plus (Successor m) n = Successor (plus m n)
append : Vector n a -> Vector m a -> Vector (plus n m) a
append Empty ys = ys
append (x::xs) ys = x :: append xs ys
लेकिन इस तकनीक में सभी रोजमर्रा की प्रोग्रामिंग में सभी उपयोगी नहीं लगते हैं। यह सॉकेट्स, POST
/ GET
अनुरोधों आदि से कैसे संबंधित है ?
वैसे यह (कम से कम बिना काफी प्रयास के) नहीं होता है। लेकिन यह अन्य तरीकों से हमारी मदद कर सकता है:
आश्रित प्रकार हमें कोड में नियम बनाने के लिए अनुमति देते हैं - नियम के रूप में एक कार्य कैसे व्यवहार करना चाहिए। इनका उपयोग करने से हमें कोड के व्यवहार के बारे में अतिरिक्त सुरक्षा मिलती है, एफिल के पूर्व और बाद के समान। यह स्वचालित प्रमेय साबित करने के लिए बेहद उपयोगी है, जो इदरिस के लिए संभावित उपयोगों में से एक है।
ऊपर के उदाहरण पर वापस आते हुए, लंबाई-एन्कोडेड सूचियों की परिभाषा प्रेरण की गणितीय अवधारणा से मिलती जुलती है । इदरीस में, आप वास्तव में इस तरह की सूची पर प्रेरण की अवधारणा तैयार कर सकते हैं:
-- If you can supply the following:
list_induction : (Property : Vector len typ -> Type) -> -- a property to show
(Property Empty) -> -- the base case
((w : a) -> (v : Vector n a) ->
Property v -> Property (w :: v)) -> -- the inductive step
(u : Vector m b) -> -- an arbitrary vector
Property u -- the property holds for all vectors
यह तकनीक रचनात्मक प्रमाणों तक सीमित है, लेकिन फिर भी बहुत शक्तिशाली है। आप append
व्यायाम के रूप में सम्मिलित रूप से लिखने का प्रयास कर सकते हैं ।
बेशक, आश्रित प्रकार प्रथम श्रेणी के प्रकारों का सिर्फ एक उपयोग है, लेकिन यह यकीनन सबसे आम लोगों में से एक है। अतिरिक्त उपयोगों में शामिल हैं, उदाहरण के लिए, अपने तर्कों के आधार पर एक फ़ंक्शन से एक विशिष्ट प्रकार को वापस करना।
type_func : Vector n a -> Type
type_func Empty = Nat
type_func v = Vector (Successor Zero) Nat
f : (v : Vector n a) -> type_func v
f Empty = 0
f vs = length vs :: Empty
यह एक निरर्थक उदाहरण है, लेकिन यह कुछ ऐसी चीजों को प्रदर्शित करता है जिनका आप प्रथम श्रेणी के प्रकार के बिना अनुकरण नहीं कर सकते।