使用Scala延续实现yield(yield return)
如何使用 Scala 延续实现 C# yield return
?我希望能够以相同的风格编写 Scala Iterator
。 这篇 Scala 新闻文章的评论中有一条刺,但不起作用(尝试使用 Scala 2.8.0 beta)。 相关问题中的答案表明这是可能的,但是尽管我玩定界延续已经有一段时间了,我似乎无法完全理解如何做到这一点。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在引入延续之前,我们需要构建一些基础设施。
下面是一个在
trampoline >迭代
对象。迭代是一种计算,可以
产生
一个新值,也可以完成
。Trampoline 使用内部循环将
Iteration
对象序列转换为Stream
。然后,我们通过在结果流对象上调用
iterator
来获得一个Iterator
。通过使用
Stream
,我们的评估是惰性的;在需要之前我们不会评估下一次迭代。蹦床可以用来直接构建迭代器。
这写起来非常糟糕,所以让我们使用分隔延续来自动创建
Iteration
对象。我们使用
shift
和reset
运算符将计算分解为Iteration
,然后使用 Trampoline 将 Iteration 转换为 Iterator。
现在我们可以重写我们的例子。
好多了!
下面是 C# 参考页 中
yield< 的示例/code> 显示了一些更高级的用法。
这些类型可能有点难以适应,但是一切都有效。
Before we introduce continuations we need to build some infrastructure.
Below is a trampoline that operates on
Iteration
objects.An iteration is a computation that can either
Yield
a new value or it can beDone
.The trampoline uses an internal loop that turns the sequence of
Iteration
objects into aStream
.We then get an
Iterator
by callingiterator
on the resulting stream object.By using a
Stream
our evaluation is lazy; we don't evaluate our next iteration until it is needed.The trampoline can be used to build an iterator directly.
That's pretty horrible to write, so let's use delimited continuations to create our
Iteration
objects automatically.We use the
shift
andreset
operators to break the computation up intoIteration
s,then use
trampoline
to turn theIteration
s into anIterator
.Now we can rewrite our example.
Much better!
Now here's an example from the C# reference page for
yield
that shows some more advanced usage.The types can be a bit tricky to get used to, but it all works.
经过几个小时的尝试后,我设法找到了一种方法来做到这一点。我认为这比迄今为止我见过的所有其他解决方案更容易理解,尽管后来我非常欣赏 Rich 的和 Miles 的 解决方案。
I managed to discover a way to do this, after a few more hours of playing around. I thought this was simpler to wrap my head around than all the other solutions I've seen thus far, though I did afterward very much appreciate Rich's and Miles' solutions.