मैं एक संकलक भाषा के लिए एक संकलक पर काम कर रहा हूं और प्रकार के अनुमान समर्थन जोड़ना चाहूंगा। मैं हिंडले-मिलनर को समझता हूं, लेकिन मैं जिस प्रकार का सिद्धांत सीख रहा हूं, मैं उसके अनुरूप हूं, इसलिए मैं इस बारे में अनिश्चित हूं कि इसे कैसे अनुकूलित किया जाए। निम्नलिखित प्रणाली ध्वनि और निर्णायक रूप से अनुमान योग्य है?
एक शब्द एक शाब्दिक, शब्दों की एक रचना, एक शब्द का एक उद्धरण, या एक आदिम है।
सभी शर्तें कार्यों को दर्शाती हैं। दो कार्यों के लिए और , , , रिवर्स रचना को दर्शाता है। साहित्य निलादिक कार्यों को दर्शाता है।ई १
रचना के अलावा अन्य शब्दों में बुनियादी प्रकार के नियम हैं:
अनुपस्थित रूप से आवेदन के लिए नियम हैं, क्योंकि संक्षिप्त भाषाओं में इसका अभाव है।
एक प्रकार या तो एक शाब्दिक, एक प्रकार का चर, या ढेर से ढेर के लिए एक फ़ंक्शन है, जहां एक स्टैक को राइट-नेस्टेड टपल के रूप में परिभाषित किया गया है। सभी कार्य स्पष्ट रूप से "ढेर के बाकी" के संबंध में बहुरूपिक हैं।
यह पहली चीज है जो संदिग्ध लगती है, लेकिन मुझे नहीं पता कि इसके साथ वास्तव में क्या गलत है।
पठनीयता में मदद करने और कोष्ठक में कटौती करने के लिए, मैं मानूंगा कि प्रकार योजनाओं में है। मैं एक एकल के बजाय एक स्टैक को दर्शाने वाले एक चर के लिए एक बड़े अक्षर का उपयोग करूंगा।
छह आदिम हैं। पहले पाँच बहुत मासूम हैं। dup
सर्वोच्च मूल्य लेता है और इसकी दो प्रतियां तैयार करता है। swap
शीर्ष दो मूल्यों का क्रम बदलता है। pop
शीर्ष मूल्य को त्यागता है। quote
एक मूल्य लेता है और एक उद्धरण (फ़ंक्शन) पैदा करता है जो इसे लौटाता है। apply
स्टैक के लिए एक उद्धरण लागू होता है।
अंतिम कॉम्बिनेटर, compose
को दो उद्धरण लेने चाहिए और उनके के प्रकार को वापस करना चाहिए, अर्थात, । वैधानिक रूप से टाइप किए गए सुगम भाषा कैट में , का प्रकार बहुत सीधा है।compose
हालांकि, यह प्रकार बहुत अधिक प्रतिबंधात्मक है: इसके लिए आवश्यक है कि पहले फ़ंक्शन का उत्पादन दूसरे की खपत से बिल्कुल मेल खाता हो । वास्तव में, आपको अलग-अलग प्रकारों को ग्रहण करना होगा, फिर उन्हें एकजुट करना होगा। लेकिन आप उस प्रकार को कैसे लिखेंगे?
यदि आप को दो प्रकारों के अंतर को हैं, तो मुझे लगता है कि आप सही प्रकार से लिख सकते हैं ।compose
यह अभी भी अपेक्षाकृत सीधा है: compose
एक फ़ंक्शन लेता है और एक । इसका परिणाम खपत की खपत के ऊपर द्वारा नहीं उत्पादित , और पैदा करता है के उत्पादन के ऊपर से भस्म नहीं । यह साधारण रचना के लिए नियम देता है।एफ 2 : डी → ई बी एफ 2 एफ 1 डी एफ 1 एफ 2
हालांकि, मुझे नहीं पता कि यह काल्पनिक वास्तव में किसी भी चीज से मेल खाता है, और मैं इसे लंबे समय तक हलकों में चारों ओर पीछा कर रहा हूं कि मुझे लगता है कि मैंने गलत मोड़ लिया। क्या यह ट्यूपल्स का सरल अंतर हो सकता है?
क्या इस बारे में कुछ बुरी तरह से टूट गया है जिसे मैं नहीं देख रहा हूं, या मैं सही रास्ते की तरह कुछ हूं? (मैंने शायद इस सामान में से कुछ को गलत तरीके से निर्धारित किया है और साथ ही उस क्षेत्र में सुधार की भी सराहना करेगा।)
compose
बहुत अधिक प्रतिबंधात्मक क्यों है? मुझे आभास है कि यह इस तरह ठीक है। (जैसे प्रतिबंध को
twice
रूप में परिभाषित पर विचार करें dup compose apply
, जो एक उद्धरण लेता है और इसे दो बार लागू करता है। [1 +] twice
ठीक है: आप टाइप कर रहे हैं दो कार्य टाइप कर रहे हैं । लेकिन नहीं है: यदि ∀ ए बी ।[pop] twice
, समस्या यह है कि है एक ≠ एक , इसलिए अभिव्यक्ति को अस्वीकृत कर दिया गया है, भले ही यह मान्य हो और टाइप the ए बी हो । । क्वालीफायर को सही जगह पर लगाने के लिए समाधान निश्चित रूप से है, लेकिन मैं मुख्य रूप से सोच रहा हूं कि वास्तव मेंकुछ परिपत्र परिभाषाकेबिनाकैसे लिखें। compose