2011-11-29 16 views
10

के हास्केल समकक्ष मैं जीएडीटी का उपयोग करके हास्केल में पूरी तरह से टाइप किए गए डीएसईएल बनाने के साथ खेल रहा हूं और इस तरह एक पूरी तरह से टाइप किए गए एएसटी के लिए, और ऐसा लगता है कि सही ढंग से टाइप किए गए कंपाइलर को करने के लिए हास्केल प्रकारों के मानचित्र जैसे संरचनाएं आवश्यक हैं दोनों प्रकार और मूल्यों (टाइप किए गए वातावरण) और ऐसे में जिन्हें हास्केल प्रकार प्रणाली द्वारा समझा जा सकता है। सी ++ में Boost.Fusion लाइब्रेरी है जैसे कि इनके प्रकार (टाइप-> वैल्यू मैप्स, टाइप किए गए मानों के वैक्टर आदि)। Data.Tuple अनुक्रमों का ख्याल रखता है, लेकिन क्या Boost.Fusion map एस जैसी चीजों के हास्केल संस्करण हैं?Boask.Fusion

+0

downvote के लिए कारण क्या था? –

+0

जब आप "कंपाइलर" का वर्णन करते हैं तो आप किस प्रस्तुति से संकलित होते हैं? यदि आपके पास जीएडीटी है, तो क्या आप वास्तव में इसके लिए दुभाषिया लिख ​​रहे हैं, या जीएडीटी से एक समारोह, उदाहरण के लिए, सी कोड? – sclv

+0

या तो - वही समस्याएं किसी भी चीज में आती हैं जो टाइप किए गए एएसटी को किसी और चीज में अनुवाद करती है या इसे चलाती है। –

उत्तर

10

dependent-map पैकेज पर देखें। मैंने इसे स्वयं नहीं इस्तेमाल किया है, लेकिन ऐसा लगता है कि आप जो भी मांग रहे हैं। तो आप एक डिफ़ॉल्ट मान पर सहमत हैं या इसके बजाय एक TypeRep कुंजी के रूप में उपयोग करने के लिए आवश्यकता हो सकती है क्या तुम सच में प्रकार (और प्रकार को केवल) समानता का उपयोग करने की जरूरत है।

import Data.Typeable 
import Data.Map 

type TypeMap a = Map TypeRep a 

insertT :: Typeable k => k -> a -> Map k a -> Map k a 
insertT v = insert (typeOf k) 

lookupT :: Typeable k => k -> a -> Map k a -> Map k a 
lookupT v = lookup (typeOf k) 

अब आप insertT (undefined :: Int) 5 की तरह कोड का उपयोग कर सकते हैं:

1

क्या आप Data.Map और सूचियों की तलाश में हैं? (उदाहरण के लिए [Int])।

+0

नहीं है, और यहाँ कुंजी प्रकार हैं: हालांकि, इस पर एक नज़र डालें। मुझे ऐसा कुछ चाहिए जो मैपिंग करता है जैसे '(इंट-> 5, फ्लोट -> "foo") एक मान में (एक प्रकार का वर्ग नहीं जो वैश्विक मैपिंग देता है)। मुझे पता है कि इसे हाथ से कैसे लिखना है (मुझे लगता है), लेकिन मैं सोच रहा था कि किसी ने इसे पहले से ही किया है। –

+1

आश्रित-मानचित्र पैकेज आज़माएं: http://hackage.haskell.org/package/dependent-map –

+0

@NathanHowell: क्या आप इसे उत्तर के रूप में पोस्ट कर सकते हैं? मैं इसे देख लूंगा, लेकिन यह प्रलेखन से दिखता है जैसे मैं पूछ रहा हूं। –

4

सबसे पहले, सभी के लिए भी स्पष्ट जवाब है कि आप आसानी से एक "type-> मूल्य नक्शा" Typeable (आधार लाइब्रेरी का हिस्सा) का उपयोग कर लिख सकते हैं प्रकार के अनुसार तत्वों को सम्मिलित करने के लिए।

लेकिन फ़्यूज़न को देखते हुए, यह वास्तव में ऐसा नहीं लगता है कि आप क्या कर सकते हैं। ऐसा लगता है कि यह आपको मनमानी डेटा संरचनाओं पर काम कर कोड बनाने की अनुमति देता है? ऐसा कुछ है जो हास्केल में "आपके बॉयलरप्लेट स्क्रैप" जेनेरिक प्रोग्रामिंग के रूप में जाना जाता है। papers या hackage जानकारी के लिए देखें, लेकिन यह आप कोड है कि यादृच्छिक डेटा सरंचनाओं संसाधित करता है और दिए गए प्रकार के मूल्यों को चुनता लिखने के लिए अनुमति देता है।

कुछ अन्य चीजें जो मैंने फ़्यूज़न के बारे में देखी थी, शायद HList या संभावित रूप से fclabels जैसे पुस्तकालयों का उपयोग करके नकल की जा सकती हैं। लेकिन यह क्या आप वास्तव में जरूरत है पर एक नज़र के बिना अधिक कहने के लिए वास्तव में मुश्किल है।

+0

आपका 'टाइपमैप' काम करेगा लेकिन कंपाइलर को मनाने के लिए 'असुरक्षित वाणिज्य' की आवश्यकता है कि दाएं तरफ के प्रकार बाईं ओर 'टाइपरप' से मेल खाते हैं (या 'डेटा। गतिशील')। एचएलिस्ट भी दिलचस्प लग रहा है; fclabels और अधिक दिखता है जैसे यह ज़िप्पर प्रदान करता है।मुझे मनमानी डेटा प्रकारों पर प्रतिबिंब/डेटा-जेनेरिक प्रोग्रामिंग की आवश्यकता नहीं है, इसलिए मुझे नहीं लगता कि SYB मदद करेगा। –

+0

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

3

जैसा कि पहले उल्लेख, dependent-map बातों का नक्शा पक्ष के लिए सही विकल्प की तरह लगता है, लेकिन मैं मैन्युअल tuples से खेल के लिए एक विकल्प के रूप में hlist की HArray इंटरफेस देखने की सलाह देते चाहते हैं।