estoy tratando de utilizar las diversas implementaciones Scala de C# -como retorno rendimiento (es decir, con this one) "para" -constructions como:aplicación Scala de C# -como rendimiento con "para"
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)
}
}
Pero este código se compila con el 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) {
Como entiendo que tengo que hacer todo el código en el interior para ser el tipo de () => Unit
, no de () => Unit @with-annotations
. ¿Cómo puedo hacer eso?
Parece que este problema es muy común, pero no encontré ninguna mención en Internet.
Tal vez me falta algo, pero las llaves en ese ejemplo no parecen coincidir. ¿Y cómo puedes llamar generar allí? Está en un ámbito anidado. –
Resolví ambos problemas quitando un soporte adicional. – Blaisorblade
Esta pregunta es un duplicado de lo siguiente, que proporciona una respuesta: http://stackoverflow.com/questions/8934226/continuations-and-for-comprehensions-whats-the-incompatibility –