【问题标题】:Typed tuples and closures in GroovyGroovy 中的类型化元组和闭包
【发布时间】:2013-05-27 00:59:35
【问题描述】:

我做了一些编程和 Haskell,想在 Groovy 中实现一些 Haskell 列表处理功能。下面是unfoldr 的实现。基本上A 是结果迭代器的类型(即列表),B 是状态。

有两件事我想赋予更强的类型:

  1. 我希望能够说Tuple<A,B> 而不仅仅是Tuple
  2. 我希望能够定义闭包的参数,而不仅仅是结果类型。

生成从 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&lt;Tuple&gt; f 参数类型?喜欢private Closure&lt;A1, A2, Tuple&gt; f?
  • 你不想解释一下吗?
  • 您好。抱歉,我现在已经转换为使用数组,而不是元组。但是,是的,private Closure&lt;Tuple&lt;A, B&gt;, C&gt; f 是我真正想要的。
  • 我认为可以通过接口来完成。您还在寻找这个问题的答案吗?
  • 威尔,我放弃了一半,但如果有答案,我真的很感兴趣!

标签: haskell types groovy strong-typing


【解决方案1】:

您面临的问题基本上是 Java 泛型以及它无法为容器声明类型的变量列表。确实,Tuple 对静态编译特别不利,因为它甚至不包含最少的泛型,但您必须考虑到 Tuple 基本上是一个包含任意数量元素的列表。您可以获得的最大值是 Tuple,其中 T 是所有元素的基类。如果您对此表示满意,那么我建议您改用任何列表。将 Tuple 定义为具有两个元素的元组,其中第一个元素的类型为 A,第二个元素的类型为 B,然后在 Java 中定义第三个元素的类型为 C 的 Tuple 是不可能的。相反,您将需要真正的不同类型,例如 Tuple2 和 Tuple3 到 TupleN。我正在详细解释这一点,因为这与为什么在 Closure 上没有此类信息的原因基本相同。闭包可用于使用从 0 到 N 的任意数量的参数进行调用。但在泛型中无法声明这一点。

在 Groovy 2.2 中,您将能够在 Unfoldr 中使用适合您需要的任何接口重新放置 Closure,而无需更改用法 def u = expandr({ x -> if (x

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 2014-08-09
    • 2012-03-27
    • 2013-06-01
    • 2013-05-07
    • 2014-11-28
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多