【发布时间】:2019-04-24 02:25:58
【问题描述】:
我正在尝试使我的函数返回一个 IO 尾递归,但它无法编译,因为我在 flatMap 中使用它。我知道为此目的构建了一些东西,例如tailRec,但我正在寻找一些关于如何使用它们的指导。这是示例代码。
import cats.effect.IO
import scala.annotation.tailrec
def process(since: Option[String]): IO[Seq[String]] = {
@tailrec
def go(startIndex: Int): IO[(Int, Seq[String])] = {
val program = since match {
case Some(s) =>
for {
r <- fetchResponse(s, startIndex)
size = r.size
ss = r.data
_ <- writeResponse(ss)
} yield (size, r)
case None => IO((0, Seq.empty[String]))
}
program.flatMap { case (size, _) =>
if (startIndex <= size) go( startIndex + size)
else IO((0, Seq.empty))
}
}
go(0).map(o => o._2)
}
case class Response(size: Int, data: Seq[String])
def fetchResponse(s: String, i: Int): IO[Response] = ???
def writeResponse(r: Seq[String]): IO[Int] = ???
【问题讨论】:
-
整个结构的哪一部分应该是尾递归的?你打算对
val上的@tailrec注释做什么? -
道歉。 Go应该是递归的。修复代码
标签: scala scala-cats