我正在查看 Rng 源代码,看看它们如何生成随机值流。
def stream[AA >: A](s: Size): Rng[EphemeralStream[AA]] =
list(s) map (EphemeralStream(_: _*))
首先,我对这个签名感到困惑。我需要一个无限流的生成器,它懒惰地产生随机值。所以我不需要size
论点。
我也对实现感到困惑。生成器似乎创建了一个列表,然后将其转换为流。然而,流的全部意义在于懒惰。我错过了什么?
我不知道
Stream
,但我们可以用scalaz-stream Process
明确地做这样的事情:
def infiniteRandomProcess: Process[Rng, Int] =
Process.await(Rng.int)({
i => Process.emit(i) ++ infiniteRandomProcess
})
然后你转换懒惰的Process
,直到你得到一些你乐于run
的东西(或runLog
等等(,你最终得到一个Rng
值(或者可能是一个单子变压器,它结合了例如 Task
(。
API可能允许将其转换为Stream
;有很多,我倾向于停留在浅端。