Haskell Groovy中的类型化元组和闭包
我做了一些编程和Haskell,并希望在Groovy中实现一些Haskell列表处理函数。下面是Haskell Groovy中的类型化元组和闭包,haskell,types,groovy,strong-typing,Haskell,Types,Groovy,Strong Typing,我做了一些编程和Haskell,并希望在Groovy中实现一些Haskell列表处理函数。下面是展开器的实现。基本上,A是结果迭代器(即列表)的类型,B是状态 有两件事我想强调: 我想说Tuple 类展开器实现java.util.Iterator { 公共展开器(闭包f,B初始) { 这个。f=f; this.state=f(init); } 公共同步了下一个() { if(hasNext()) { A curr=state.get(0); state=f(state.get(1)); 返回货币
展开器
的实现。基本上,A
是结果迭代器(即列表)的类型,B
是状态
有两件事我想强调:
Tuple
类展开器实现java.util.Iterator
{
公共展开器(闭包f,B初始)
{
这个。f=f;
this.state=f(init);
}
公共同步了下一个()
{
if(hasNext())
{
A curr=state.get(0);
state=f(state.get(1));
返回货币;
}
其他的
{
抛出java.lang.NoSuchElementException;
}
}
公共同步布尔值hasNext()
{
返回(状态!=null);
}
public void remove(){抛出UnsupportedOperationException;}
私人关闭f;
私有元组状态;
}
def unbover={f,init->new unbover(f,init)};
def u=unfover({x->if(x<100){new Tuple(x+1,x+1)}else null;},0);
for(e在u中)
{
打印e;
打印“\n”;
}
这里您面临的问题主要是Java泛型及其无法为容器声明变量类型列表。确实,Tuple对于静态编译尤其有害,因为它甚至不包含泛型的最小值,但是您必须考虑Tuple基本上是一个具有任意数量元素的列表。可以得到的最大值是Tuple,其中T是所有元素的基类。如果你同意的话,我建议用任何列表来代替。将Tuple定义为具有两个元素的Tuple,其中第一个元素具有类型a,第二个元素具有类型B,然后定义第三个元素具有类型C的Tuple在Java中是不可能的。相反,您将需要真正不同的类型,如Tuple2和Tuple3到TupleN。我正在详细解释这一点,因为这与为什么没有关于关闭的信息的原因基本相同。闭包可用于使用从0到N的任意数量的参数进行调用。但在泛型中无法声明这一点
在Groovy 2.2中,您将能够使用任何适合您需要的接口在Unfolder中重新放置闭包,而无需更改def u=Unfolder({x->if(x<100){new Tuple(x+1,x+1)}else null;},0) 您可以声明闭包参数的类型并使用CompileStatic
,这就是您想要的吗?或者您想声明私有闭包f
参数类型?比如私人闭包
?你不想解释一下吗?嗨,威尔。抱歉,我现在已转换为使用数组,而不是元组。但是,是的,私有闭包f
是我真正想要的。我认为它可以通过接口来实现。你还在寻找这个问题的答案吗?威尔,我半途而废,但如果有答案,我会非常感兴趣的!
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";
}