2011-09-27 10 views
11

में डेटा कन्स्ट्रक्टर मैं रिंग जेड/एन (सामान्य अंकगणित की तरह, लेकिन मॉड्यूल कुछ पूर्णांक) बनाने की कोशिश कर रहा हूं। एक उदाहरण उदाहरण Z4:टेम्पलेट हैकेल

instance Additive.C Z4 where 
    zero = Z4 0 
    (Z4 x) + (Z4 y) = Z4 $ (x + y) `mod` 4 

और इसलिए अंगूठी के लिए। मैं इन चीजों को जल्दी से उत्पन्न करने में सक्षम होना चाहता हूं, और मुझे लगता है कि ऐसा करने का तरीका टेम्पलेट हैकेल के साथ है। आदर्श रूप में मैं बस $(makeZ 4) पर जाना चाहता हूं और इसे ऊपर परिभाषित Z4 के लिए कोड थूकना चाहता हूं।

हालांकि मुझे इसके साथ बहुत परेशानी हो रही है। जब मैं genData n = [d| data $n = $n Integer] करता हूं तो मुझे "डेटा/न्यूटाइप घोषणा में पार्स त्रुटि" मिलती है। यह काम करता है अगर मैं चर का उपयोग नहीं करता हालांकि: [d| data Z5 = Z5 Integer |], जिसका अर्थ यह है कि मैं चर के साथ अजीब कुछ कर रहा हूं। मुझे यकीन नहीं है कि क्या है; मैंने उन्हें नए नाम के माध्यम से बनाने की कोशिश की और ऐसा लगता है कि यह भी काम नहीं कर रहा था।

कोई भी यहां क्या हो रहा है इसके साथ मेरी सहायता कर सकता है?

+0

मैं टेम्पलेट हास्केल विज़ार्ड नहीं हूं, लेकिन मैं उन लोगों को सट्टेबाजी कर रहा हूं जो आपके टेम्पलेट हास्केल कोड को देखना चाहते हैं। –

उत्तर

13

Template Haskell documentation उन चीजों को सूचीबद्ध करता है जिन्हें आपको विभाजित करने की अनुमति है।

एक जोड़

  • एक अभिव्यक्ति के स्थान पर हो सकता है; स्प्लिस्ड अभिव्यक्ति में Q Exp
  • एक प्रकार होना चाहिए; स्प्लिस्ड अभिव्यक्ति में टाइप Q Typ
  • शीर्ष-स्तरीय घोषणाओं की एक सूची होनी चाहिए; spliced ​​अभिव्यक्ति प्रकार Q [Dec]

$n के दोनों घटनाओं में होना आवश्यक है, हालांकि, आप एक नाम ब्याह करने के लिए कोशिश कर रहे हैं।

इसका मतलब है कि आप उद्धरण और विभाजन का उपयोग करके ऐसा नहीं कर सकते हैं। आपको Language.Haskell.TH मॉड्यूल में उपलब्ध विभिन्न संयोजकों का उपयोग करके घोषणा करना होगा।

मुझे लगता है कि यह आपके द्वारा किए जाने वाले प्रयासों के बराबर होना चाहिए।

genData :: Name -> Q [Dec] 
genData n = fmap (:[]) $ dataD (cxt []) n [] 
          [normalC n [strictType notStrict [t| Integer |]]] [] 

हाँ, यह थोड़ा बदसूरत है, लेकिन आप वहां जाते हैं। इसका उपयोग करने के लिए, इसे ताजा नाम से बुलाएं, उदा।

$(genData (mkName "Z5")) 
+0

क्या आप इसके उपयोग का एक उदाहरण शामिल कर सकते हैं? मैंने आपके पास थोड़ा सा संशोधित किया था और मेरे कोड में शीर्ष-स्तर के रूप में '$ (genData "foo") फेंक दिया था, लेकिन अगर मैं करता हूं तो मैं ghci में' foo' करता हूं तो उसे कुछ भी नहीं मिलता है। – Xodarap

+1

@Xodarap: 'स्ट्रिंग' से 'नाम' बनाने के लिए 'mkName' का उपयोग करें। मैंने एक उदाहरण जोड़ा है। मुझे लगता है कि आपने 'newName' का उपयोग किया होगा, जो यह सुनिश्चित करने के लिए अंत में कुछ सामान जोड़ता है कि नाम अद्वितीय है, इसलिए 'जानकारी' इसे नहीं दिखाएगी। हालांकि, आपको 'ब्राउज़' का उपयोग करके इसे देखने में सक्षम होना चाहिए। – hammar

+0

धन्यवाद! यह मेरी समस्या बिल्कुल ठीक थी। – Xodarap