让我们考虑生成一个随机数序列的问题,约束是最终序列应该有一个固定的长度n
,并且前面/后面的元素应该不同(即邻居应该不同)。我的第一个惯用方法是:
val seq = Stream.continually{ Random.nextInt(10) }
.foldLeft(Stream[Int]()){ (all: Stream[Int], next: Int) =>
if (all.length > 0 && all.last != next)
all :+ next
else
all
}
.take(n)
不幸的是,这不起作用,因为 foldLeft 试图消耗整个无限流,从而导致无限循环。直观地根据这个问题,我预计这种行为仅适用于使用foldRight
? 也许我只是错过了另一个惯用的解决方案?