Sono un neofita di Scala e cerco di capovolgere le continuazioni Sto provando a riprodurre l'istruzione C# yield return
.Continuazioni e per comprensioni - qual è l'incompatibilità?
seguito this post, ho scritto il seguente codice:
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(())
()
}
}
Come si può vedere, gen2
sia commentata in quanto non può essere compilato. Poiché posso facilmente eseguire iterazioni sul contenuto di un elenco utilizzando un ciclo while (vedi gen3
), mi aspettavo che il ciclo foreach funzionasse altrettanto bene.
L'errore di compilazione è il seguente:
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
Perché ricevo questo errore e c'è un modo per ovviare a questo con qualcosa di più pulito di un ciclo while?
Grazie
possibile duplicato di [rendimento di implementazione (rendimento restituito) utilizzando le continuazioni di Scala] (http: // stackoverflow.it/questions/2201882/implementation-yield-yield-return-using-scala-continuations) –
Non sto cercando una risposta che mi dica come riprodurre "yield return" usando le continuazioni di Scala. Sto cercando il motivo per cui il 'gen2' nel mio esempio non funziona. Il "rendimento" è solo il contesto in cui ho riscontrato questo problema. – GuiSim
Ah, scusa allora. –