gpt4 book ai didi

斯卡拉/Play : Write Enumeratee that prepends a value to the stream

转载 作者:行者123 更新时间:2023-12-01 10:05:43 27 4
gpt4 key购买 nike

我想写一个枚举对象,它只是将一个 Input.El 插入迭代对象,然后返回剩余的迭代对象。我称它为前置,因为它通过在它前面加上一个值来改变流。这是我的尝试:

object Enumeratees {
def prepend[T](toPrepend: T) = new Enumeratee[T, T] {
def applyOn[A](inner: Iteratee[T, A]): Iteratee[T, Iteratee[T, A]] = {
val prepended = Iteratee.flatten(inner.feed(Input.El(toPrepend)))
Done(prepended, Input.Empty)
}
}
}

当我现在调用它时

Enumerator(1,2,3,4) |>> (Enumeratees.prepend(0)  &>> Iteratee.foreach[Int]{i=>println(i)})

它只打印应该放在前面的 0。枚举器的其他值将被忽略。如果我也覆盖了枚举对象的 &> 方法(转换方法),我可以让它工作:

def prepend[T](toPrepend: T) = new Enumeratee[T, T] {
def applyOn[A](inner: Iteratee[T, A]): Iteratee[T, Iteratee[T, A]] = {
val prepended = Iteratee.flatten(inner.feed(Input.El(toPrepend)))
Done(prepended, Input.Empty)
}

override def transform[A](inner: Iteratee[T,A]): Iteratee[T,A] =
Iteratee.flatten(inner.feed(Input.El(toPrepend)))
}

但这不是一个非常干净的方法,因为 applyOn 方法仍然无效。我想我弄错了 applyOn 方法的含义。在我看来,它应该返回一个迭代器,该迭代器返回原始迭代器,然后在原始迭代器上继续输入。

上面的 transform 方法应该解释我想从我的枚举者那里得到什么行为。如何通过覆盖 applyOn 而不是转换来实现此行为?

最佳答案

要么将您的前置 Enumeratee 编辑为如下所示:

object Enumeratees {
def prepend[T](toPrepend: T) = new Enumeratee[T, T] {
def applyOn[A](inner: Iteratee[T, A]): Iteratee[T, Iteratee[T, A]] = {
val prepended = Iteratee.flatten(inner.feed(Input.El(toPrepend)))
Enumeratee.passAlong[T](prepended)
}
}
}

或者在对它应用 Enumeratee 和 Enumerator 之后得到原始的 Iteratee,类似于 Scala: Getting original iteratee after applying enumeratee (example from play documentation doesn't compile)

&>>> 将在外部完成时结束内部迭代。这是能够获得 Iteratee[EOuter,AInner] 的唯一方法,因为 Enumeratee 主要是关于适应的。

关于斯卡拉/Play : Write Enumeratee that prepends a value to the stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10977090/

27 4 0