Continuaciones y para comprensiones: ¿cuál es la incompatibilidad?
-
30-10-2019 - |
Pregunta
Soy nuevo en Scala e intento entender continuaciones, estoy tratando de reproducir el yield return
Declaración C#.
Siguiendo esta publicación, He escrito el siguiente código:
package com.company.scalatest
import scala.util.continuations._;
object GenTest {
val gen = new Generator[Int] {
def produce = {
yieldValue(1)
yieldValue(2)
yieldValue(3)
yieldValue(42)
}
}
// Does not compile :(
// val gen2 = new Generator[Int] {
// def produce = {
// var ints = List(1, 2, 3, 42);
//
// ints.foreach((theInt) => yieldValue(theInt));
// }
// }
// But this works?
val gen3 = new Generator[Int] {
def produce = {
var ints = List(1, 2, 3, 42);
var i = 0;
while (i < ints.length) {
yieldValue(ints(i));
i = i + 1;
}
}
}
def main(args: Array[String]): Unit = {
gen.foreach(println);
// gen2.foreach(println);
gen3.foreach(println);
}
}
abstract class Generator[E] {
var loopFn: (E => Unit) = null
def produce(): Unit @cps[Unit]
def foreach(f: => (E => Unit)): Unit = {
loopFn = f
reset[Unit, Unit](produce)
}
def yieldValue(value: E) =
shift { genK: (Unit => Unit) =>
loopFn(value)
genK(())
()
}
}
Como puedes ver, gen2
se comenta como no se compila. Dado que puedo iterar fácilmente sobre el contenido de una lista usando un bucle de tiempo (ver gen3
), Esperaba que el bucle foreach funcionara igual de bien.
El error de compilación es el siguiente:
no type parameters for method foreach: (f: Int => B)Unit exist so that
it can be applied to arguments (Int => Unit @scala.util.continuations.cpsParam[Unit,Unit])
--- because ---
argument expression's type is not compatible with formal parameter type;
found : Int => Unit @scala.util.continuations.cpsParam[Unit,Unit]
required: Int => ?B
¿Por qué recibo este error y hay alguna manera de trabajar con esto con algo más limpio que un bucle de tiempo?
Gracias
No hay solución correcta
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow