2011-01-04 4 views
5

मुझे यकीन नहीं है कि मुझे यह भी पता है कि इस सवाल से कैसे पूछना है .. एक कंपाइलर को लागू करने में मैं क्लाइंट को टुपल्स पर निर्दिष्ट, कहने के लिए अनुमति देना चाहता हूं। मैंने एक समारोह को घुमाने और अनिश्चित करने का एक तरीका प्रदान किया है, लेकिन केवल इसलिए कि मैंने ओकैम में एक बाइनरी ऑपरेटर लिखा था और इसे शब्द और टाइप प्रस्तुतियों पर जोड़ दिया था। उपयोगकर्ता इस समारोह को नहीं लिख सका।पॉलीएडिक ऑपरेशंस को कार्यान्वित और प्रतिनिधित्व

मैक्रो प्रोसेसर में, उपयोगकर्ता इस फ़ंक्शन को लिख सकता है क्योंकि टुपल्स सूचियां हैं।

करीबी कार्यों के लिए, उपयोगकर्ता आसानी से ट्रांसफॉर्मर लिख सकता है, क्योंकि यह शब्द लक्ष्य भाषा और ओकैम शब्द और टाइपिंग दोनों में बाइनरी है।

लेकिन वे टुपल्स के लिए ऐसा नहीं कर सकते हैं। यहां एक और उदाहरण दिया गया है: उपयोगकर्ता आसानी से धारावाहिक कार्यात्मक संरचना ऑपरेटर को परिभाषित करता है। लेकिन उपयोगकर्ता समानांतर संरचना को परिभाषित नहीं कर सकते: द्विआधारी संस्करण:

f1: D1 -> C1, f2: D2-> C2 --> f1 * f2: D1 * D2 -> C1 * C2 

आसानी से लिखा है, लेकिन 3 पदों के लिए नहीं बढ़ाया जा सकता है: यहाँ एक गुना

f1 * (f2 * f3) 
बजाय

f1 * f2 * f3 
परिकलित किया जाएगा

[आइसोमोर्फिक लेकिन बराबर नहीं]

इस प्रश्न का सामान्यीकरण "कैसे क्या मैं एक पॉलीएडिक प्रोग्रामिंग भाषा लागू करता हूं "जो यहां पूछने के लिए बहुत कुछ है। मैंने जो करने की कोशिश की वह एक बिल्टिन ट्रांसफार्मर प्रदान करता था:

करी: टी 1 * टी 2 * टी 3 ... -> टी 1 -> टी 2 -> ... अनिश्चितता: टी 1 -> टी 2 -> .. टी 1 * टी 2 * T3

ऐसा है तो उपयोगकर्ता सिर्फ एक द्विआधारी ऑपरेटर के साथ सिलवटों कर सकता है:

uncurry (fold user_op (uncurry term)) 

लेकिन यह है न पर्याप्त रूप से सामान्य है और न ही इतनी अच्छी तरह से काम करता है .. :)

मैं एक बराबर सवाल लगता है हास्केल के लिए होगा: चूंकि हास्केल में कोई एन-आरी उत्पाद नहीं है, इसलिए एन-आरी ट्यूपल कंस्ट्रक्टर अनुकरण किए जाते हैं पुस्तकालय में एन कार्यों के साथ, जहां प्रत्येक को हाथ से लिखा जाना है। यह स्पष्ट रूप से बेकार है। यह कैसे तय किया जाएगा?

[मेरा मतलब है, यह कुछ सीमा n करने के लिए उन n कार्यों उत्पन्न करने के लिए एक अजगर स्क्रिप्ट लिखने के लिए मामूली बात है, तो क्यों यह इतना कठिन भाषा के अंदर एक अच्छी तरह से टाइप किया तरह से यह करने के लिए? है]

उत्तर

2

दो ऐसे घटक होते इस मुद्दे पैदा करने के लिए सहयोग कर रहे हैं:

  • tuples ऑटो चपटा नहीं हैं - प्रकार भाव में कोष्ठकों, समूह की तुलना में अधिक कर वे भिन्न प्रकार कि आगे tuples द्वारा शामिल हो गए हैं पैदा करते हैं। यह आपके अवलोकन की ओर जाता है कि a * (b * c) isomorphic है लेकिन a * b * c के बराबर नहीं है।
  • टाइप सिस्टम ट्यूपल प्रकारों पर बीजगणित को व्यक्त करने का माध्यम प्रदान नहीं करता है। इसका मतलब है कि टाइप सिस्टम में विपक्षी ऑपरेटर या ट्यूपल्स के बराबर कोई समकक्ष नहीं है; यह अभिव्यक्त करने का कोई तरीका नहीं है कि किसी प्रकार के प्रकार के मुकाबले एक प्रकार के कम या कम tupled तत्व हैं।

परिणाम यह है कि मनमाने ढंग से लम्बाई पर चलने वाले फ़ंक्शन के प्रकार को व्यक्त करने का कोई तरीका नहीं है।

तो, संक्षेप सारांश यह है कि ओकैमल प्रकार प्रणाली में उस कार्य के प्रकार को व्यक्त करने के लिए तंत्र की कमी है जिसे आप लिखने की कोशिश कर रहे हैं, और इसलिए आप फ़ंक्शन नहीं लिख सकते हैं (Obj के साथ गंदा गेम को अलग करना; आप फ़ंक्शन लिख सकते हैं , लेकिन आप इसे टाइप-सेफ फैशन में इस्तेमाल करने के लिए अपने प्रकार को व्यक्त नहीं कर सके)।

+2

हाँ, लेकिन यह मेरा सवाल नहीं है: मैं ओकैम के प्रकार की प्रणाली के बारे में नहीं पूछ रहा हूं, मैं यह पूछ रहा हूं कि इसे किसी अन्य भाषा में कैसे कार्यान्वित किया जाए (वास्तव में मेरी भाषा फ़ेलिक्स, संकलक जिसके लिए ओकम्ल में लिखा गया है)। – Yttrill

0

मूल रूप से दो विकल्प हैं।

आप अपनी भाषा को अनचाहे या कमजोर टाइप कर सकते हैं। उदाहरण के लिए सी में, tuples (पूर्णांक के, कहते हैं) int* के रूप में प्रतिनिधित्व किया जा सकता है। कुछ को टुपल्स की लंबाई का ट्रैक रखने की आवश्यकता होगी लेकिन टाइप सिस्टम नहीं होगा। मुझे लगता है कि आप इस तरह से नहीं जाना चाहते हैं।

एक प्रकार की सुरक्षित भाषा के लिए, आपको एक बहुत ही अभिव्यक्तिपूर्ण प्रकार प्रणाली की आवश्यकता है। अर्थात्, आपको मूल्यों पर निर्भर प्रकारों की आवश्यकता होती है। जिनमें से सदस्य काम करते हैं जो प्रकार लौटाते हैं। उदाहरण के लिए ट्यूपल प्रकार कन्स्ट्रक्टर (ट्यूपल कन्स्ट्रक्टर के साथ भ्रमित नहीं होना चाहिए) में tuple : int -> Type -> Type हो सकता है। एक ऑपरेशन जो टुपल को बढ़ाता है, में forall n:int. forall T:Type. tuple n T -> T -> tuple (n+1) T टाइप हो सकता है। इस प्रकार के सिस्टम लागत पर आते हैं: आम तौर पर, टाइप अनुमान को रिकर्सिव नहीं होता है और टाइपिंग जांच केवल तभी होती है जब आप अपने प्रकार के साथ सभी प्रकार के उप-अभिव्यक्तियों को एनोटेट करने के इच्छुक हैं (forall उपरोक्त हिस्सों में एनोटेशन केवल उस संकेत का संकेत है जो वह करेगा आवश्यक।)। यदि आप जो कुछ हासिल करना चाहते हैं, वह पॉलीएडिसिटी है, हालांकि यह विकल्प ओवरकिल लगते हैं।

अस्वीकरण: प्रकार सिद्धांत पर मेरा ज्ञान थोड़ा दिनांकित है।

+0

आप सही हैं, मैं कमजोर टाइपिंग नहीं चाहता हूं। हालांकि मैं टाइप अनुमान को नापसंद करता हूं इसलिए टाइपिंग स्पष्ट होने पर मुझे कोई परवाह नहीं है। मुझे लगता है कि पूरी तरह से निर्भर टाइपिंग overkill होगा। यहां तक ​​कि एटीएस हांगवेई ज़ी की भाषा में), यह जल्द ही देखा जाता है कि जब कोई सरल रैखिक पूर्णांक सूत्रों से अधिक विस्तार करने का प्रयास करता है तो सबूत सत्यापन अव्यवहारिक होता है, अगर अव्यवस्थित नहीं होता है। – Yttrill

+0

बीटीडब्ल्यू: कष्टप्रद बात यह है कि आप वास्तव में प्रकार की जांच के बिना इस तरह की चीज को आसानी से कर सकते हैं: टेम्पलेट्स के साथ सी ++ में और योजना में। फेलिक्स में मेरा सिस्टम वास्तव में ट्यूपल विपक्ष कर सकता है, यह सिर्फ सरणी के साथ काम नहीं करता है (जो एक सामान्य तत्व प्रकार के साथ टुपल्स के समान हैं)। लेकिन किसी को केवल विपक्ष और uncons की तुलना में बहुत अधिक जरूरत है। जीएडीटी के साथ मैं और अधिक कर सकता हूं। लेकिन शांत सुविधाओं के इन संग्रह सिर्फ हैक हैं। यह सामान्य नहीं है। फिर भी मैं पाइथन का उपयोग करके कोड को "प्रिंट" करने के लिए आसानी से कुछ भी कर सकता हूं। – Yttrill

+0

बीटीडब्ल्यू: मुझे लगता है कि निर्भर टाइपिंग (मूल्यों के आधार पर प्रकार) का विकल्प है, जो मेटा-टाइपिंग (दयालु) है। उदाहरण के लिए फ़ेलिक्स में लम्बाई 5 की एक सरणी पहले ही टी^5 टाइप कर रही है, जहां 5 5 इकाइयों का योग 1 + 1 + 1 + 1 + 1 है जहां 1 मान() के प्रकार "इकाई" है। तो अगर वहाँ एक तरह का "यूनिटसम" था तो tuple: int -> टाइप -> प्रकार को फिर से लिखा जाएगा tuple: यूनिट्सम -> टाइप -> टाइप, जिसे अब निर्भर टाइपिंग की आवश्यकता नहीं है, बल्कि इसके बजाय एक दयालु प्रणाली है। – Yttrill

संबंधित मुद्दे