gpt4 book ai didi

scala Iterator 中的 scalaz Iteratees

转载 作者:行者123 更新时间:2023-12-01 10:11:34 26 4
gpt4 key购买 nike

我编辑了下面的代码,因为我认为我在 iter.next 问题之上错误地组合了 IterV 对象。

我正在 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直接取自 scalaz 的源代码示例 web site正常工作:

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

最佳答案

我想我明白了。这似乎主要是由于 El 使用按名称参数重新计算 iter.next - 以及我最初如何使用两个不同的 错误地调用计算peek(iter).run.我重写了枚举器,首先将 iter.next 分配给 val(并在此过程中使其尾递归):

implicit val iteratorEnumerator = new Enumerator[Iterator] {
@annotation.tailrec
def apply[E,A](iter: Iterator[E], i: IterV[E,A]): IterV[E,A] = i match {
case _ if iter.isEmpty => i
case Done(acc, input) => i
case Cont(k) =>
val x = iter.next
apply(iter, k(El(x)))
}
}

然后:

def peekpeek[A] = 
for (a1 <- peek[A]; a2 <- peek[A]) yield (a1,a2)
def peekheadpeek[A] =
for (a1 <- peek[A]; a2 <- head[A]; a3 <- peek[A]) yield (a1,a2,a3)
def headpeekhead[A] =
for (a1 <- head[A]; a2 <- peek[A]; a3 <- head[A]) yield (a1,a2,a3)

peekpeek(Iterator(1,2,3)).run
peekheadpeek(Iterator(1,2,3)).run
headpeekhead(Iterator(1,2,3)).run
length(Iterator.from(1).take(1000000)).run

会返回这个:

res13: (Option[Int], Option[Int]) = (Some(1),Some(1))
res14: (Option[Int], Option[Int], Option[Int]) = (Some(1),Some(1),Some(2))
res15: (Option[Int], Option[Int], Option[Int]) = (Some(1),Some(2),Some(2))
res16: Int = 1000000

关于scala Iterator 中的 scalaz Iteratees,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4573635/

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