'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
- 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";
}
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
Bu konuda biraz ışık tutmak istemez miydin? – Will
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