継続と包括的 - 互換性とは何ですか?
-
30-10-2019 - |
質問
私はSCALAに初めてであり、私の頭を連続して包み込もうとしています私は再現しようとしています yield return
C#ステートメント。
続く この郵便受け, 、次のコードを書きました:
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(())
()
}
}
ご覧のように、 gen2
コンパイルされていないためにコメントアウトされています。時間のループを使用してリストのコンテンツを簡単に反復することができるので(参照してください gen3
)、foreachループも同様に機能すると予想していました。
コンパイルエラーは次のとおりです。
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
なぜこのエラーが発生し、しばらくループよりクリーンなものでこれを回避する方法がありますか?
ありがとうございました
正しい解決策はありません
所属していません StackOverflow