Scala,无限重复有限列表
我想在 scala 中使用 Stream 类来无限重复给定的列表。
例如列表 (1,2,3,4,5) 我想创建一个给我 (1,2,3,4,5,1,2,3,4,5,1,2,3 ....)
这样我就可以包装 take 操作。我知道这可以通过其他方式实现,但出于某种原因我想这样做,只是幽默一下:)
所以我的想法是,通过从某个列表创建这个无限循环,我可以使用 take 操作,当它到达时它循环列表的末尾。
如何制作一个简单地重复给定列表的流?
I want to use Stream class in scala to repeat a given list infinitely.
For example the list (1,2,3,4,5) I want to create a stream that gives me (1,2,3,4,5,1,2,3,4,5,1,2,3....)
So that I can wrap the take operation. I know this can be implemented in other ways, but I wanna do it this way for some reason, just humor me :)
So the idea is that with this infinite cycle created from some list, I can use take operation, and when it reaches the end of the list it cycles.
How do I make a stream which simply repeats a given list?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
另一种方法是将输入的
.toStream
与其自身递归连接。那是,An alternative method is concatenating the
.toStream
of the input with itself recursively. That is,scala 2.8 中有一个使用 Stream#flatten 的简单方法
There is a simple way with Stream#flatten in scala 2.8
这是一个不假设
length
有效的实现:对于任何
Seq
(包括List
甚至>Stream
),并且只施加恒定的时间开销来填充每个元素。此外,它甚至适用于无限序列。因此,您可以在无限的Stream
上调用rep
,生成的Stream
将相当于输入。Here's an implementation which doesn't assume that
length
is efficient:This should run in constant time for any
Seq
(includingList
or evenStream
) and only imposes a constant time overhead to populate each element. Also, it works even for infinite sequences. So, you can callrep
on an infiniteStream
and the resultingStream
will be equivalent to the input.公然窃取了优秀的 Scala by Example 书第 12 章,以及进行一些修改:
这适用于所有 Seq 类型(当然,除非它们不能多次读取)。如果 .length 调用很慢,可能效率不高。在 Scala 2.7.7 中测试。
Stolen blatently from the excellent Scala by Example book, chapter 12, and with a few modifications:
This works for all Seq types (unless they can't be read from multiple times, of course). Might not be efficient if the .length call is slow. Tested in Scala 2.7.7.
与@Eastsun 非常相似,但更能揭示意图。在 Scala 2.8 中测试。
或者,使用 Scalaz:
Very similar to @Eastsun's, but a bit more intention revealing. Tested in Scala 2.8.
Alternatively, with Scalaz: