Zrobiłem trochę programowania i Haskell, i chciałem zaimplementować niektóre funkcje przetwarzania list Haskella w Groovy. Poniżej znajduje się implementacja unfoldr
. Zasadniczo A
jest rodzajem wynikowego iteratora (tj. Listą) i B
jest stanem.Wpisane krotki i zamknięcia w Groovy
Są dwie rzeczy, które chciałbym dać silniejsze typy do:
- które chciałbym móc powiedzieć
Tuple<A,B>
zamiast tylkoTuple
- że chciałbym być w stanie określić argumenty zamknięcia, a nie tylko typ wyniku.
Przykładowy kod, który generuje iterator, który wylicza od 1 do 100, znajduje się poniżej i jest połączony z ideonem 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";
}
Możesz zadeklarować typ argumentów zamknięcia i użyć 'CompileStatic', czy tego chcesz? Lub chcesz zadeklarować typ argumentu 'private Closure f'? Jak "zamknięcie prywatne f'? –
Will
Czy nie chcesz rzucić trochę światła na to? – Will
Witaj Will. Przepraszam, teraz przekonwertowałem na używanie tablic, a nie krotek. Ale tak, "naprawdę potrzebowałem" prywatnego zamknięcia, C> f'. –
Clinton