我已经做了一些编程和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