Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Groovy中的类型化元组和闭包_Haskell_Types_Groovy_Strong Typing - Fatal编程技术网

Haskell Groovy中的类型化元组和闭包

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)); 返回货币

我做了一些编程和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));
    返回货币;
    }
    其他的
    {
    抛出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";
    }