Tôi mới sử dụng Scala và cố gắng quấn đầu quanh các lần tiếp tục Tôi đang cố gắng tạo lại tuyên bố C# yield return
C#.Tiếp tục và để hiểu - tính không tương thích là gì?
Sau this post, tôi đã viết đoạn mã sau:
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(())
()
}
}
Như bạn thấy, gen2
là nhận xét ra vì nó không biên dịch. Vì tôi có thể dễ dàng lặp qua nội dung của danh sách bằng cách sử dụng vòng lặp while (xem gen3
), tôi dự kiến vòng lặp foreach cũng sẽ hoạt động.
Các lỗi biên dịch như sau:
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
Tại sao tôi nhận được lỗi này và có cách nào để làm việc xung quanh này với một cái gì đó sạch sẽ hơn một vòng lặp while?
Cảm ơn bạn
bản sao có thể có của [Thực hiện lợi nhuận (lợi tức lợi nhuận) bằng cách sử dụng tiếp tục Scala] (http: // stackoverflow.com/questions/2201882/implementation-yield-yield-return-use-yield-yield-return-using-scala-continuations) –
Tôi không tìm câu trả lời cho tôi biết cách tạo lại 'lợi tức' bằng cách sử dụng tiếp tục Scala. Tôi đang tìm kiếm lý do tại sao 'gen2' trong ví dụ của tôi không hoạt động. 'Lợi tức lợi nhuận' chỉ là bối cảnh mà tôi gặp phải vấn đề này. – GuiSim
Ah, xin lỗi sau đó. –