gpt4 book ai didi

scala - 为什么在Scala Iteratees中需要Empty输入用例?

转载 作者:行者123 更新时间:2023-12-04 04:22:01 24 4
gpt4 key购买 nike

我已经看到了对Scala中Iteratee模式的3个描述,其中包括3个输入案例。例如,来自詹姆斯:

sealed trait Input[+E]
object Input {
case object EOF extends Input[Nothing]
case object Empty extends Input[Nothing]
case class El[+E](e: E) extends Input[E]
}

有关更多详细信息,请参见 JamesRunarJosh的博客。

我的问题很简单:为什么精确地需要“空”输入用例?

迭代模式定义了值(value)流的生产者和消费者之间的关系。凭直觉看,如果有任何输入为空,则“运行”迭代器的生产者应该简单地将该空项折叠起来,并且在非空输入可用之前不要调用迭代器。

我注意到,基于迭代器的基于拉的模拟(更熟悉的迭代器)没有定义空的情况,尽管有可能元素已在“迭代器内部”被过滤掉。
trait Iterator[E] {
next: E // like El
hasNext: Boolean //like EOF
}

尽管以上所有博客都提到需要传递空输入,但是他们没有明确讨论为什么不能完全消除空输入。我注意到显示的示例迭代器将Empty输入视为无操作。

我真的很想一个带有代码的例子,说明一个可能的“现实世界中的”问题,需要用Empty输入消息来解决。

最佳答案

假设您连接了一个枚举器,该枚举器将一些元素提供给peek iteratee,后者查看第一个元素并返回它但不使用它,从而使它可能由将由peek组成的另一个iteratee使用。然后,您需要为peek提供一种机制来放回元素。从Play和Scalaz的iteratee来看,完成的iteratee正是为此目的而论证的。因此,您可以执行类似伪代码的操作:done(Some(result), El(result))。参见this implementation of peek

现在,如果您实现了像 head 这样的东西,但实际上会消耗该元素,那么感觉到的一种方法是返回done(Some(result), emptyInput)以指示输入已被消耗。

另请参见播放框架源代码中的this comment,其中显示Done(_,_)的第二个参数用于未使用的输入,并将其初始化为空默认值。因此,空的并不是很少使用的东西,很难找到真实的例子。这实际上是实现迭代对象的关键。实际上,看看哪些iteratee框架没有空白以及如何实现偷看和监视可能会很有趣。

关于scala - 为什么在Scala Iteratees中需要Empty输入用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17287415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com