开发者

Scala implementation of C#-like yield with "for"

I'm trying to use various Scala implementations of C#-like yield return (i.e. this one) with "for" -constructions such as:

private def permutations[T](s: Vec开发者_如何学JAVAtor[T]) = {
  def swap(i: Int, j: Int) {
    val tmp = s(i)
    s.set(i, s.get(j))
    s.set(j, tmp)
  }

  iterator[Vector[T]] {
    def generate(left: Int, right: Int): Unit @cps[Iteration[Vector[T]]] = {
      if (left >= right)
        yieldValue(s)

      else {
        generate(left, right)
        for (i <- left to right) {
          swap(left, i)
          generate(left+1, right)
          swap(left, i)
        }
      }
    }

    generate(0, s.size-1)
  } 
}

But this code compiles with error:

error: no type parameters for method foreach: (f: (Int) => U)Unit exist so that it can be applied to arguments ((Int) => Unit @util.continuations.package.cps[ru.ispras.texterra.nlp.GHMMDisambiguator.Iteration[Vector[T]]])
--- because ---
argument expression's type is not compatible with formal parameter type;
found   : (Int) => Unit @util.continuations.package.cps[ru.ispras.texterra.nlp.GHMMDisambiguator.Iteration[Vector[T]]]
required: (Int) => ?U
for (i <- left to right) {

As I understand I have to make all code inside for to be type of () => Unit, not of () => Unit @with-annotations. How can I do that?

This problem seems to be very common, but I didn't found any mentions in the Internet.


If you're using the iterator type from the linked example, is it possible that your generate method needs to have the following return type rather than the one you have there?

Unit @cps[Iteration[Vector[T]],Iteration[Vector[T]]]

I'm afraid I haven't got much experience with this stuff but it looks a lot like the methods you call within iterator must have two (identical) type arguments on the annotation.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜