3

1 つの Input.El を iteratee にプッシュし、残りの iteratee を返す enumeratee を書きたいと思います。ストリームに値を追加するだけでストリームを変更するため、私はこれを prepend と呼んでいます。これが私の試みです:

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 のみを出力します。列挙子からの他の値は無視されます。enumeratee (transform メソッド) の &> メソッドもオーバーライドすると、動作させることができます。

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 メソッドの意味を間違えたようです。私の意見では、元の iteratee を返す iteratee を返す必要があり、入力は元の iteratee で続行されます。

上記の transform メソッドは、enumeratee にどのような動作が必要かを説明する必要があります。transform の代わりに applyOn を上書きして、この動作を実現するにはどうすればよいですか?

4

2 に答える 2

7

prependEnumerateeを次のように編集します。

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)
    }
  }
}

または、列挙子と列挙子を適用した後に元のIterateeを取得します。たとえば、Scala:列挙子を適用した後に元のIterateeを取得します(Playドキュメントの例はコンパイルされません)

&>>外側が完了したら、内側の反復を終了します。Iteratee[EOuter,AInner]Enumerateeは主に適応に関するものであるため、これが取得できる唯一の方法です。

于 2012-06-11T13:35:41.603 に答える
0

どうですか

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

また

Enumerator(1,2,3,4) |>> (Enumeratees.prepend2(0) &> Iteratee.foreach[Int]{i=>println(i)})
于 2012-06-11T10:28:51.230 に答える