2013-05-27 9 views
7

में टाइप किए गए टुपल्स और क्लोजर मैंने थोड़ा प्रोग्रामिंग और हास्केल किया है, और ग्रोवी में कुछ हास्केल सूची प्रसंस्करण कार्यों को कार्यान्वित करना चाहता था। नीचे unfoldr का कार्यान्वयन है। मूल रूप से A परिणामस्वरूप इटरेटर (यानी सूची) का प्रकार है और B राज्य है।ग्रोवी

दो चीजें मैं करने के लिए मजबूत प्रकार देना चाहते हैं कर रहे हैं: परिभाषित करने के लिए सक्षम होने के लिए मैं Tuple<A,B> के बजाय सिर्फ Tuple

  • कहने में सक्षम होना चाहते हैं

    1. मैं चाहूँगा बंद करने के तर्क, न केवल परिणाम प्रकार।

    उदाहरण कोड जो एक पुनरावर्तक उत्पन्न करता है जो 1 से 100 तक इंगित करता है नीचे है और here पर विचार किया गया है।

    class Unfoldr<A,B> implements java.util.Iterator<A> 
    { 
        public Unfoldr(Closure<Tuple> f, B init) 
        { 
        this.f = f; 
        this.state = f(init); 
        } 
    
        public synchronized A next() 
        { 
        if (hasNext()) 
        { 
         A curr = state.get(0); 
         state = f(state.get(1)); 
         return curr; 
        } 
        else 
        { 
         throw java.lang.NoSuchElementException; 
        } 
        } 
    
        public synchronized boolean hasNext() 
        { 
        return (state != null); 
        } 
    
        public void remove() { throw UnsupportedOperationException; } 
    
        private Closure<Tuple> f; 
    
        private Tuple state; 
    } 
    
    def unfoldr = { f, init -> new Unfoldr(f, init) }; 
    
    def u = unfoldr({ x -> if (x < 100) { new Tuple(x + 1, x + 1) } else null; }, 0); 
    
    for(e in u) 
    { 
        print e; 
        print "\n"; 
    } 
    
  • +0

    आप क्लोजर के तर्कों का प्रकार घोषित कर सकते हैं और 'कंपाइलस्टैटिक' का उपयोग कर सकते हैं, क्या आप चाहते हैं? या आप 'निजी क्लोजर एफ' तर्क प्रकार घोषित करना चाहते हैं? 'निजी बंद <ए 1, ए 2, ट्यूपल> एफ' की तरह? – Will

    +0

    क्या आप इस पर कुछ प्रकाश डालना पसंद नहीं करेंगे? – Will

    +0

    हाय विल। क्षमा करें, अब मैं सरणी का उपयोग करने के लिए परिवर्तित कर दिया गया है, tuples नहीं। लेकिन हाँ, 'निजी बंद , सी> एफ' वह था जो मैं वास्तव में देख रहा था। – Clinton

    उत्तर

    2

    समस्या आप का सामना करना पड़ता है यहाँ मूल रूप से जावा जेनरिक और एक कंटेनर के लिए प्रकार की एक चर सूची की घोषणा करने में असमर्थ। सच है, ट्यूपल स्थिर संकलन के लिए विशेष रूप से खराब है, क्योंकि इसमें कम से कम जेनेरिक भी नहीं हैं, लेकिन आपको यह समझना होगा कि ट्यूपल मूल रूप से तत्वों की मनमानी मात्रा के साथ एक सूची है। अधिकतम आप प्राप्त कर सकते हैं ट्यूपल, जहां टी सभी तत्वों के लिए आधार वर्ग है। और यदि आप इसके साथ ठीक हैं, तो मैं इसके बजाय किसी भी सूची का उपयोग करने का सुझाव देता हूं। ट्यूपल को दो तत्वों के साथ एक टुपल के रूप में परिभाषित करना जहां पहले टाइप ए और दूसरा प्रकार बी है और फिर टुपल को परिभाषित करने जा रहा है जहां जावा में तीसरा तत्व टाइप सी संभव नहीं है। इसके बजाय आपको वास्तविक विभिन्न प्रकारों जैसे टुपले 2 और टुपले 3 को टुपलेएन की आवश्यकता होगी। मैं इसे बहुत विस्तार से समझा रहा हूं, क्योंकि यह मूल रूप से एक ही कारण है कि क्लोजर पर ऐसी कोई जानकारी क्यों नहीं है। 0 से एन तक किसी भी तर्क का उपयोग करके कॉल करने के लिए क्लोजर का उपयोग किया जा सकता है लेकिन इसे घोषित करने के लिए जेनेरिक में कोई रास्ता नहीं है।

    ग्रोवी 2.2 में आप अनफॉल्डर में क्लोजर को दोबारा उपयोग करने में सक्षम होंगे, जो आपकी जरूरतों को फिट करता है, बिना उपयोग डी यू = unfoldr ({x -> if (x < 100) {new tuple (x) + 1, एक्स + 1)} और शून्य;}, 0);