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.
精彩评论