Ho eseguito un po 'di programmazione e Haskell e ho voluto implementare alcune funzioni di elaborazione dell'elenco Haskell in Groovy. Di seguito è una implementazione di unfoldr
. Fondamentalmente lo A
è il tipo dell'iteratore risultante (ad esempio, l'elenco) e lo stato è B
.Tuple e chiusure tipizzate in Groovy
Ci sono due cose che mi piacerebbe dare tipi più forti per:
- mi piacerebbe poter dire
Tuple<A,B>
invece diTuple
- mi piacerebbe essere in grado di definire gli argomenti della chiusura, non solo il tipo di risultato.
Esempio di codice che genera un iteratore che enumera da 1 a 100 è sotto e collegato su ideone 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";
}
Puoi dichiarare il tipo degli argomenti della chiusura e usare 'CompileStatic', è quello che vuoi? O vuoi dichiarare il tipo di argomento 'Closure privato? Come "chiusura privata f'? –
Will
non ti piacerebbe far luce su questo? – Will
Ciao Will. Scusa, ora mi sono convertito all'utilizzo di matrici, non di tuple. Ma sì, 'Closure privato, C> f' era quello che stavo davvero cercando. –
Clinton