我正在查看Rng来源,了解它们如何生成随机值流。
def stream[AA >: A](s: Size): Rng[EphemeralStream[AA]] =
list(s) map (EphemeralStream(_: _*))
首先,我对此签名感到困惑。我需要一个无限流的生成器,它可以懒惰地生成随机值。所以我不需要size
参数。
我也对实施感到困惑。生成器似乎创建了一个列表,然后将转换为流。然而,流的整个要点是懒惰。我错过了什么?
答案 0 :(得分:2)
我不了解Stream
,但我们可以使用scalaz-stream Process
明确地做出类似的事情:
def infiniteRandomProcess: Process[Rng, Int] =
Process.await(Rng.int)({
i => Process.emit(i) ++ infiniteRandomProcess
})
然后你改变了懒惰的Process
,直到你得到了run
(或runLog
左右)的某些内容,并最终获得{{1}值(或者可能是将其与例如Rng
组合在一起的monad变换器。)
API可能允许将其转换为Task
;那里有很多,我倾向于留在浅水区。