पहले एक शब्दावली विवरण: नकारात्मक और सकारात्मक स्थिति तर्क से आती है। वे तार्किक संयोजनों में एक अस्मिता के बारे में हैं: में ए बी से अलग व्यवहार करता है । एक समान बात श्रेणी सिद्धांत में होती है, जहां हम कहते हैं कि नकारात्मक और सकारात्मक के बजाय क्रमशः, कंट्रावेरिएंट और सहसंयोजक हैं। भौतिक विज्ञान में वे मात्राओं की बात करते हैं जो "कोवरिएन्टली" और "कॉन्ट्रैरिएक्टिवली" भी व्यवहार करते हैं। इसलिए यह एक बहुत ही सामान्य घटना है। एक प्रोग्रामर उन्हें "इनपुट" और "आउटपुट" के रूप में सोच सकता है।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 की और हम के बारे में सोच एक निर्माता है कि लेता है के रूप में प्रकार के -कई तर्क का एक तत्व का निर्माण करने के ।AccATT
यहां कुछ बहुत महत्वपूर्ण है: परिभाषित करने से पहले हमें परिभाषित किया जाना चाहिए T, अन्यथा हम यह नहीं बता सकते हैं कि निर्माणकर्ता क्या कर रहे हैं। अगर कोई कंस्ट्रक्टर करने की कोशिश करता है
broken: (T -> T) -> T
तो सवाल "कितने तर्क brokenलेता है?" कोई अच्छा जवाब नहीं है। हो सकता है कि आप इसे "यह Tतर्क-वितर्क के साथ" जवाब देने की कोशिश करें , लेकिन ऐसा नहीं होगा, क्योंकि Tअभी तक इसे परिभाषित नहीं किया गया है। हम एक प्रकार Tऔर एक इंजेक्शन फ़ंक्शन को खोजने के लिए फैंसी निश्चित-बिंदु सिद्धांत का उपयोग करके क्यूनड्रम से बाहर निकलने की कोशिश कर सकते हैं (T -> T) -> T, और सफल होंगे, लेकिन हम Tरास्ते के लिए प्रेरण सिद्धांत को भी तोड़ देंगे । इसलिए, इस तरह की कोशिश करना एक बुरा विचार है।
λvλ ⋅ वीcB
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और अंततः स्टैक-आधारित भाषाओं में स्टैक को विस्फोट कर सकता है ।