Scala реализация C # -подобного выхода с «для» - PullRequest
6 голосов
/ 19 июля 2010

Я пытаюсь использовать различные реализации Scala для C # -подобного возврата (т. Е. этот ) с конструкциями "for", такими как:

private def permutations[T](s: Vector[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)
  } 
}

Но этот кодкомпилируется с ошибкой:

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) {

Насколько я понимаю, я должен сделать весь код внутри, чтобы иметь тип () => Unit, а не () => Unit @with-annotations.Как я могу это сделать?

Эта проблема кажется очень распространенной, но я не нашел упоминаний в Интернете.

1 Ответ

0 голосов
/ 20 июля 2010

Если вы используете тип iterator из связанного примера, возможно ли, что ваш метод generate должен иметь следующий тип возврата, а не тот, который у вас есть?

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

Боюсь, у меня нет большого опыта работы с этим, но похоже, что методы, которые вы вызываете в iterator, должны иметь два (идентичных) аргумента типа в аннотации.

...