私はiter.next
の問題の上でIterVオブジェクトを誤って組み合わせていたと思うので、以下のコードを編集しました。scalaz Iterator from scala Iterator
私はscalazでIteratee
を実験しています。なぜ私は次のように動作しないのでしょうか?ここでは、私が持っているものです:
import scalaz._
import Scalaz._
import IterV._
implicit val iteratorEnumerator = new Enumerator[Iterator] {
def apply[E,A](iter: Iterator[E], i: IterV[E,A]): IterV[E,A] =
if (iter.isEmpty) i
else i.fold(done = (acc,input) => i,
cont = k => apply(iter, k(El(iter.next))))
}
/* probably incorrect
val iter = Iterator(1,2,3)
println("peek(iter) " + peek(iter).run)
println("peek(iter) " + peek(iter).run)
*/
def peekpeek[E]: IterV[E, (Option[E],Option[E])] =
for (a <- peek; b <- peek) yield (a,b)
def peekheadpeek[E]: IterV[E, (Option[E],Option[E],Option[E])] =
for (a <- peek; b <- head; c <- peek) yield (a,b,c)
peekpeek(Iterator(1,2,3,4)).run
peekheadpeek(Iterator(1,2,3,4)).run
これが返されます。
res0: (Option[Int], Option[Int]) = (Some(1),Some(2))
res1: (Option[Int], Option[Int], Option[Int]) = (Some(1),Some(2),Some(3))
私は(Some(1),Some(1))
と(Some(1),Some(1),Some(2))
を期待していました。
これは、副作用があると思われるiter.next
と思われます。それに対処する最善の方法は何ですか?比較のために
、thisが正常に動作web site scalazからソースコードの例から直接取得:
implicit val StreamEnumerator = new Enumerator[Stream] {
def apply[E, A](e: Stream[E], i: IterV[E, A]): IterV[E, A] = e match {
case Stream() => i
case x #:: xs => i.fold(done = (_, _) => i,
cont = k => apply(xs, k(El(x))))
}
}
最初はうまくいきましたが、イテレータは実際にはdef firstTwo [E]:IterV [E、(Option [E]、Option [E])] = for(a < - head ; b < - head)yield(a、b) 'returns'(Some(1)、Some(1)) ' – huynhjl