我做了一些编程和 Haskell,想在 Groovy 中实现一些 Haskell 列表处理功能。下面是一个实现unfoldr
。基本上A
是生成的迭代器的类型(即列表)并且B
是状态。
有两件事我想给更强的类型:
- 我想能够说
Tuple<A,B>
,而不仅仅是Tuple
- 我希望能够定义闭包的参数,而不仅仅是结果类型。
下面是生成从 1 到 100 枚举的迭代器的示例代码,并在ideone 上链接。
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";
}