我已經做了一些編程和Haskell,並希望在Groovy中實現一些Haskell列表處理函數。以下是unfoldr
的實現。基本上A
是生成的迭代器的類型(即列表),B
是狀態。在Groovy中輸入元組和閉包
有兩件事情我想給強類型:
- 我希望能說
Tuple<A,B>
,而不是僅僅Tuple
- 我希望能夠定義閉包的參數,而不僅僅是結果類型。
生成枚舉從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'參數類型?像'私人關閉 f'? –
Will
難道你不想在這方面做點什麼嗎? – Will
你好。對不起,我現在已經轉換爲使用數組,而不是元組。但是,是的,'私人關閉,C> f'是我真正想要的。 –
Clinton