प्रथम श्रेणी के नागरिक के रूप में प्रकार


10

C ++ बैकग्राउंड से आते हुए मुझे समझ नहीं आता कि प्रथम श्रेणी के नागरिक के रूप में किसी को टाइप्स / टाइप एक्सप्रेशंस की आवश्यकता क्यों है? एकमात्र भाषा जो मुझे पता है कि इस सुविधा का समर्थन करती है।

क्या किसी के पास प्रथम श्रेणी के नागरिक के रूप में कुछ साहित्य है या कुछ कारण पता है कि यह उपयोगी क्यों है?


3
इदरीस के पास ये भी हैं।
थ्री एफएक्स

1
क्या आप "टाइप ए वैल्यू" की सामान्य अवधारणा के बारे में पूछ रहे हैं (जिसे विभिन्न भाषाओं में "प्रतिबिंब" या "मेटाक्लासेस" कहा जाता है) या टाइप एक्सप्रेशंस की अधिक विशिष्ट अवधारणा के बारे में?
svick

1
@svick मुझे बाद में दिलचस्पी है। दुर्भाग्य से मुझे टाइप एक्ट्रेसेस के बारे में ज्यादा सामान्य चीजें नहीं मिलीं, इसलिए अच्छा होगा अगर आप कुछ साहित्य सुझा सकें।
पॉल

जवाबों:


11

प्रथम श्रेणी के प्रकार आश्रित टाइपिंग नामक कुछ को सक्षम करते हैं । ये प्रोग्रामर को टाइप स्तर पर मानों का उपयोग करने की अनुमति देते हैं। उदाहरण के लिए, पूर्णांकों के सभी युग्मों का प्रकार एक नियमित प्रकार है, जबकि सभी पूर्णांकों की जोड़ी बाईं संख्या से दाईं संख्या की तुलना में छोटी एक आश्रित प्रकार है। इस का मानक परिचयात्मक उदाहरण लंबाई एन्कोडेड सूचियों (आमतौर पर 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

यह एक निरर्थक उदाहरण है, लेकिन यह कुछ ऐसी चीजों को प्रदर्शित करता है जिनका आप प्रथम श्रेणी के प्रकार के बिना अनुकरण नहीं कर सकते।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.