Je suis en train d'utiliser différentes implémentations Scala de rendement de rendement C# -comme (c.-à-this one) avec « pour » -Constructions tels que:mise en œuvre Scala de rendement C# -comme avec « pour »
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)
}
}
Mais ce code se compile avec l'erreur:
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) {
Comme je comprends que je dois faire tout le code à l'intérieur pour être le type de () => Unit
, pas de () => Unit @with-annotations
. Comment puis je faire ça?
Ce problème semble être très commun, mais je n'ai trouvé aucune mention dans Internet.
Peut-être qu'il me manque quelque chose, mais les accolades sur cet exemple ne semblent pas correspondre. Et comment pouvez-vous appeler générer là? C'est dans une portée imbriquée. –
J'ai résolu les deux problèmes en enlevant une attelle supplémentaire. – Blaisorblade
Cette question est une copie de ce qui suit, qui fournit une réponse: http://stackoverflow.com/questions/8934226/continuations-and-for-comprehensions-whats-the-incompatibility –