Groovy

2013-05-27 20 views
7

'de yazılan tupl ve kapaklar biraz programlama ve Haskell yaptım ve Groovy'de bazı Haskell liste işleme işlevlerini uygulamak istedim. Aşağıda, unfoldr'un bir uygulamasıdır. Temel olarak A, ortaya çıkan yineleyici (yani liste) tipidir ve B durumdur.Groovy

ben daha güçlü türlerini vermek istiyorum iki şey vardır: tanımlamak mümkün İsterdim ben Tuple<A,B> yerine sadece Tuple

  • söyleyebilmek istiyorum

    1. Kapananın argümanları, sadece sonuç tipini değil.

    1'den 100'e kadar numaralandıran bir yineleyici oluşturan örnek kod aşağıdadır ve here numaralı ideone bağlıdır.

    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

    Kapağın argümanlarının türünü bildirebilir ve 'CompileStatic' işlevini kullanabilirsiniz, istediğiniz nedir? Veya özel kapama f' arguments türünü bildirmek mi istiyorsunuz? Özel Kapanış f' gibi mi? – Will

    +0

    Bu konuda biraz ışık tutmak istemez miydin? – Will

    +0

    Merhaba Will. Üzgünüm, şimdi dizileri kullanmaya değil, dizilere dönüştürdüm. Ama evet, 'Özel Kapanış , C> f' gerçekten aradığım şeydi. – Clinton

    cevap

    2

    yüz Burada sorun temelde Java jenerik ve bir kap için tiplerinin değişken listesini ilan etme yetersizliğidir. Doğru, Tuple, statik derleme için özellikle kötüdür, çünkü en az jenerik bile içermez, fakat Tuple'ın temelde öğelerin keyfi bir miktarı olan bir liste olduğunu düşünmelisiniz. Alabileceğiniz maksimum değer, T'nin tüm öğeler için temel sınıf olduğu Tuple'dır. Ve eğer bunun için uygun değilse, o zaman bunun yerine herhangi bir liste kullanmanızı öneririm. Tuple'ı, birincisi A tipi ve ikincisi B tipi olan ve daha sonra üçüncü elementin C tipi olduğu Tuple'yi tanımlayacak olan iki elementle bir tuple tanımlanması Java'da mümkün değildir. Bunun yerine Tuple2 ve Tuple3 ile TupleN gibi gerçek farklı türlere ihtiyacınız olacak. Bunu çok ayrıntılı olarak açıklıyorum çünkü bu temelde Kapanış hakkında böyle bir bilginin bulunmamasının nedenlerinden biri. Kapatma, 0'dan N'ye kadar herhangi bir sayıdaki argümanı kullanarak arama yapmak için kullanılabilir. Ancak, jeneriklerde bunu bildirmenin bir yolu yoktur.

    Groovy 2.2'de, Unfoldr'daki Kapanış'ı, kullanım eksikliğini değiştirmek zorunda kalmadan, ihtiyaçlarınızı karşılayacak herhangi bir arabirim ile ulaştırmanız mümkün olacaktır. U = unfoldr ({x -> if (x < 100) {new Tuple (x + 1, x + 1)} else null;}, 0);