2011-11-17 15 views
7

में एक प्रकार निर्माता के लिए एक स्ट्रिंग में कनवर्ट करें:वहाँ जो कुछ इस तरह करता है हास्केल में एक समारोह है कि अगर किसी को भी पता है हास्केल

"Int" -> Int 

"String" -> String 

"Bool" -> Bool 

अर्थात्। यह एक प्रकार के कन्स्ट्रक्टर नाम का स्ट्रिंग प्रस्तुति लेता है, और अभिव्यक्ति में और पैटर्न में दोनों को वास्तविक प्रकार के कन्स्ट्रक्टर में परिवर्तित करता है।

संपादित करें: मेरे समग्र लक्ष्य की तरह कुछ सरल करने के लिए है: एक ही पैटर्न मैच में

transExp (Add exp1 exp2) vars 
    = transExp exp1 vars ++ transExp exp2 vars ++ [IAdd] 

transExp (Sub exp1 exp2) vars 
    = transExp exp1 vars ++ transExp exp2 vars ++ [ISub] 

, तो मूल रूप से परिवर्तित एक स्ट्रिंग में जोड़े या उप, सामने करने के लिए एक "मैं" जोड़ने के लिए, और परिवर्तित यह एक प्रकार के लिए वापस।

+3

क्या यह भी संभव है? एक संकलन-समय अवधारणा के प्रकार नहीं हैं? आप किस प्रकार के काम की तलाश कर रहे हैं? –

+0

मुझे नहीं पता कि यह संभव है या नहीं, मुझे लगता है कि इसमें स्ट्रिंग -> ए टाइप होगा, लेकिन मुझे वास्तव में यकीन नहीं है ... – Jack

+0

तब टेम्पलेट हैकेल पर एक नज़र डालें। इसके अलावा 'IAdd' एक प्रकार का नहीं बल्कि एक प्रकार का कन्स्ट्रक्टर है - जो भ्रामक था। – nponeccop

उत्तर

10

किसी भी खाका हास्केल या प्रतिबिंब धोखाधड़ी के बिना यहाँ कोड refactor करने के लिए एक बहुत अच्छा तरीका है बस एक में अपने Add और Sub मामलों में शामिल होने से नहीं है:

data BinOp = Add | Sub | ... 

data Expr = ... 
      | BinOp BinOp Expr Expr 
      | ... 

transExp (BinOp op exp1 exp2) vars 
    = transExp exp1 vars ++ transExp exp2 vars ++ [transOp op] 
... 

transOp Add = IAdd 
transOp Sub = ISub 

इस तरह, हम डेटा प्रकार का उपयोग कर रहे सीधे इस तथ्य को व्यक्त करने के लिए कि बाइनरी ऑपरेटरों से संबंधित हैं, और इसलिए इसी तरह के अनुवाद हैं। यदि आप कहीं भी जोड़ने के लिए एक विशेष मामला बनाना चाहते हैं तो आप अभी भी BinOp Add exp1 exp2 पर पैटर्न मिलान कर सकते हैं।

+0

अद्भुत समाधान - जो मैं सोच रहा था उससे बहुत कम हैकी। बहुत बहुत धन्यवाद :) – Jack

+0

यह कहीं अधिक सुरुचिपूर्ण है। अनुस्मारक के लिए धन्यवाद कि यह फिर से ज़ूम आउट करने और व्यापक दृश्य लेने में मदद करता है। –

2

किस संदर्भ में? टेम्पलेट हास्केल और Data.Typeable है, लेकिन वास्तव में उपयोगी उत्तर के लिए आपको अधिक जानकारी प्रदान करने की आवश्यकता है।

0

ठीक है, यहां समस्या है।

"String" -> String 

निरर्थक शब्दों हास्केल-भूमि में है यही कारण है, क्योंकि "String" एक मूल्य है, लेकिन String एक प्रकार है। तो आप इसे आजमा सकते हैं:

String -> a 

यह वही नहीं करता जो आप चाहते हैं। आपको टाइप हस्ताक्षर कैसे पढ़ना है, सीखना चाहिए, क्योंकि यदि आप प्रकार हस्ताक्षर नहीं पढ़ सकते हैं, तो आपको हास्केल में बुरी तरह से विकलांग होने जा रहे हैं। उपर्युक्त प्रकार का अर्थ है, "मुझे एक स्ट्रिंग दें और मैं आपको किसी भी प्रकार का अनुरोध दे सकता हूं।" इस हस्ताक्षर के साथ प्रस्ताव में एक फ़ंक्शन है, इसे error कहा जाता है, जो आप नहीं चाहते हैं।

ऐसा लगता है की तरह आप इन पंक्तियों के साथ कुछ चाहते हैं:

String -> TypeRep 

क्षमा करें, ऐसी कोई कार्य करते हैं। TypeRepRead कक्षा को तुरंत चालू नहीं करता है।

आप वास्तव में क्या करने की कोशिश कर रहे हैं? यदि आप हमें बताते हैं कि आप वास्तव में क्या करने की कोशिश कर रहे हैं, तो हम इस समस्या से निपटने के बजाय उस समस्या से आपकी सहायता कर सकते हैं।

+0

वह प्रकार के नामों के बारे में बात नहीं कर रहा है लेकिन प्रकार के रचनाकारों के बारे में बात नहीं कर रहा है। वह बॉयलरप्लेट से बचने के लिए तारों से कुछ मूल्यों और पैटर्न मैचों को उत्पन्न करना चाहता है। – nponeccop

+2

@nponeccop: प्रश्न परिवर्तन के बाद उत्तर को कम करने के लिए बिल्कुल उचित नहीं है। रचनाकारों के बारे में यह व्यवसाय पूरी तरह से नया है। –

0

आप ऐसा नहीं कर सकते हैं, क्योंकि तार रनटाइम डेटा हैं और प्रकार संकलन समय पर पूरी तरह से हल किए जाने हैं। सबसे अच्छा तो आप शायद अपने उदाहरण के साथ कर सकते दोहराव से कुछ को खत्म करने की एक सहायक समारोह है:

helper exp1 exp2 vars op = transExp exp1 vars ++ transExp exp2 vars ++ [op] 
transExp (Add exp1 exp2) vars = helper exp1 exp2 vars IAdd 
transExp (Sub exp1 exp2) vars = helper exp1 exp2 vars ISub 

लेकिन यह वास्तव में लंबे समय में बहुत उपयोगी नहीं हो सकता है, आप कैसे कई मामलों के आधार पर।

सामान्य रूप से, पैटर्न मिलान कुछ ऐसा होता है जो प्रकार संरचनाओं के खिलाफ चलता है, इसलिए इसे ठोस प्रकार के रचनाकारों के खिलाफ संकलन प्रकार पर लिखा जाना चाहिए। वास्तव में ठोस स्थिर प्रकार प्रणाली रखने के लिए आपको वह कीमत चुकानी पड़ेगी।

+0

वह टेम्पलेट हास्केल कोड के साथ ऐसा कर सकता है जो संकलन समय – nponeccop

+0

पर चलता है वास्तव में वह कर सकता था, लेकिन इस उद्देश्य के लिए उसने कहा कि मुझे थोड़ा अधिक लगता है। –

+0

मुझे लगता है कि उसे सभी संभावित समाधानों के बारे में पता होना चाहिए। यह जानने के लिए कि वह क्या कर सकता है, यह एक अच्छा अवसर है। @hammar समाधान भी अद्भुत है। – nponeccop

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