【发布时间】:2011-04-17 09:31:13
【问题描述】:
基本上我想转换这个:
def data(block: T => Unit)
到一个流(dataToStream 是一个进行这种转换的假设函数):
val dataStream: Stream[T] = dataToStream(data)
我想这个问题可以通过延续来解决:
// let's assume that we don't know how data is implemented
// we just know that it generates integers
def data(block: Int => Unit) { for (i <- 0 to 10) block(i) }
// here we can print all data integers
data { i => println(i) }
// >> but what we really want is to convert data to the stream <<
// very dumb solution is to collect all data into a list
var dataList = List[Int]()
data { i => dataList = i::dataList }
// and make a stream from it
dataList.toStream
// but we want to make a lazy, CPU and memory efficient stream or iterator from data
val dataStream: Stream[Int] = dataToStream(data)
dataStream.foreach { i => println(i) }
// and here a black magic of continuations must be used
// for me this magic is too hard to understand
// Does anybody know how dataToStream function could look like?
谢谢,大卫
【问题讨论】:
-
悬赏无线程答案,或令人信服的论点,没有任何答案。
-
你的“块”没有任何价值。那怎么能变成流呢?单位是单例。
-
所需的流是发送到“block”的一系列参数,而不是这些调用的结果。
-
为什么需要流?有什么特殊原因吗? Traversable 或 TraversableView 为您提供了很大的灵活性。 map、flatMap、filter 等都是惰性的。它使用异常来防止在调用诸如 take 之类的方法时对“阻塞”的每次调用。总而言之,这里对 Stream 的需求似乎很琐碎,并且确实需要(A)使用线程能够在“数据”函数和流迭代之间来回交换堆栈。或 (B) 缓冲所有值并从此缓冲区创建 Stream。这更多的是你在 JVM 上拥有什么工具,虽然我很想感到惊讶
-
这只是一个例子。我不在乎我最终会使用 Stream、Iterator 还是 Traversable。本质是将数据生成器转换为惰性、内存和 CPU 高效的“数据流”。
标签: scala callback yield continuations generator