पहले एक शब्दावली विवरण: नकारात्मक और सकारात्मक स्थिति तर्क से आती है। वे तार्किक संयोजनों में एक अस्मिता के बारे में हैं: में ए बी से अलग व्यवहार करता है । एक समान बात श्रेणी सिद्धांत में होती है, जहां हम कहते हैं कि नकारात्मक और सकारात्मक के बजाय क्रमशः, कंट्रावेरिएंट और सहसंयोजक हैं। भौतिक विज्ञान में वे मात्राओं की बात करते हैं जो "कोवरिएन्टली" और "कॉन्ट्रैरिएक्टिवली" भी व्यवहार करते हैं। इसलिए यह एक बहुत ही सामान्य घटना है। एक प्रोग्रामर उन्हें "इनपुट" और "आउटपुट" के रूप में सोच सकता है।A ⇒ Bएबी
अब आगमनात्मक डेटाटिप्स पर।
टीटीटी
बीजगणित में यह प्रथागत है कि एक ऑपरेशन में तर्कों की एक सीमित संख्या होती है, और ज्यादातर मामलों में यह शून्य (निरंतर), एक (एकात्मक) या दो (बाइनरी) तर्क लेता है। डेटाटाइप्स के निर्माणकर्ताओं के लिए इसे सामान्यीकृत करना सुविधाजनक है। मान लीजिए कि c
एक प्रारूपक के लिए एक निर्माणकर्ता है T
:
- अगर
c
एक स्थिर है तो हम इसे एक फ़ंक्शन के रूप में unit -> T
, या समकक्ष रूप से सोच सकते हैं (empty -> T) -> T
,
- अगर
c
यह एकात्मक है तो हम इसे एक फ़ंक्शन के रूप में T -> T
या समकक्ष रूप से सोच सकते हैं (unit -> T) -> T
,
- अगर
c
है द्विआधारी हम एक समारोह के रूप में यह सोच सकते हैं T -> T -> T
, या समतुल्य T * T -> T
, या समतुल्य (bool -> T) -> T
,
- यदि हम एक निर्माणकर्ता चाहते हैं
c
जो सात तर्क लेता है, तो हम इसे एक फ़ंक्शन के रूप में देख सकते हैं (seven -> T) -> T
जहां seven
कुछ सात तत्वों के साथ पहले से परिभाषित प्रकार है।
- हमारे पास एक कंस्ट्रक्टर भी हो सकता है,
c
जो अनगिनत रूप से कई तर्कों को लेता है, जो एक फ़ंक्शन होगा (nat -> T) -> T
।
ये उदाहरण बताते हैं कि एक निर्माणकर्ता का सामान्य रूप होना चाहिए
c : (A -> T) -> T
जहाँ हम फोन arity की और हम के बारे में सोच एक निर्माता है कि लेता है के रूप में प्रकार के -कई तर्क का एक तत्व का निर्माण करने के ।A
c
c
A
T
T
यहां कुछ बहुत महत्वपूर्ण है: परिभाषित करने से पहले हमें परिभाषित किया जाना चाहिए T
, अन्यथा हम यह नहीं बता सकते हैं कि निर्माणकर्ता क्या कर रहे हैं। अगर कोई कंस्ट्रक्टर करने की कोशिश करता है
broken: (T -> T) -> T
तो सवाल "कितने तर्क broken
लेता है?" कोई अच्छा जवाब नहीं है। हो सकता है कि आप इसे "यह T
तर्क-वितर्क के साथ" जवाब देने की कोशिश करें , लेकिन ऐसा नहीं होगा, क्योंकि T
अभी तक इसे परिभाषित नहीं किया गया है। हम एक प्रकार T
और एक इंजेक्शन फ़ंक्शन को खोजने के लिए फैंसी निश्चित-बिंदु सिद्धांत का उपयोग करके क्यूनड्रम से बाहर निकलने की कोशिश कर सकते हैं (T -> T) -> T
, और सफल होंगे, लेकिन हम T
रास्ते के लिए प्रेरण सिद्धांत को भी तोड़ देंगे । इसलिए, इस तरह की कोशिश करना एक बुरा विचार है।
λvλ ⋅ वीc
B
c : B * (A -> T) -> T
दरअसल, कई निर्माताओं को इस तरह से लिखा जा सकता है, लेकिन सभी नहीं, हम एक और कदम की जरूरत है, अर्थात् हम अनुमति चाहिए A
करने के लिए निर्भर पर B
:
c : (∑ (x : B), A x -> T) -> T
यह एक प्रेरक प्रकार के लिए एक निर्माता का अंतिम रूप है। यह भी ठीक है कि डब्ल्यू-प्रकार क्या हैं। फॉर्म इतना सामान्य है कि हमें केवल एक ही निर्माता की आवश्यकता है c
! दरअसल, अगर हमारे पास उनमें से दो हैं
d' : (∑ (x : B'), A' x -> T) -> T
d'' : (∑ (x : B''), A'' x -> T) -> T
तब हम उन्हें एक में जोड़ सकते हैं
d : (∑ (x : B), A x -> T) -> T
कहाँ पे
B := B' + B''
A(inl x) := A' x
A(inr x) := A'' x
वैसे, यदि हम सामान्य रूप से करी करते हैं तो हम देखते हैं कि यह समान है
c : ∏ (x : B), ((A x -> T) -> T)
जो लोग वास्तव में प्रूफ असिस्टेंट में लिखते हैं उनके करीब है। प्रूफ सहायक हमें सुविधाजनक तरीके से कंस्ट्रक्टरों को लिखने की अनुमति देते हैं, लेकिन वे सामान्य रूप से ऊपर (व्यायाम) के बराबर हैं।
A
और अंततः स्टैक-आधारित भाषाओं में स्टैक को विस्फोट कर सकता है ।