私は少しのプログラミングとHaskellを行い、GroovyでいくつかのHaskellリスト処理関数を実装したかったのです。以下はunfoldr
の実装です。基本的にA
は、結果のイテレータ(つまりリスト)のタイプであり、B
は状態です。Groovyの型付きタプルとクロージャ
私は強いタイプを与えたいのですが二つあります。
- は私が定義できるようにしたいと思いちょうど
Tuple
- 私は
Tuple<A,B>
の代わりを言うことできるようにしたいのですが結果の型だけでなく、クロージャの引数
1から100まで列挙するイテレータを生成するコード例は、以下のものであり、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";
}
クロージャの引数の型を宣言し、 'CompileStatic'を使うことができます。あるいは、 'private closure f'引数型を宣言したいでしょうか? 'Private Closure f'のように? –
Will
あなたはこれについていくつかの光を当てるのが好きではないですか? – Will
こんにちは。申し訳ありませんが、私はタプルではなく配列を使って変換しました。しかし、はい、 'Private Closure、C> f'が私が本当に探していたものでした。 –
Clinton