例如:
def foo(bar: String): UIO[String] = {
for {
f <- UIO("baz")
res <- foo(f)
} yield res
}
似乎不可能,因为最后一行是映射函数
例如:
def foo(bar: String): UIO[String] = {
for {
f <- UIO("baz")
res <- foo(f)
} yield res
}
似乎不可能,因为最后一行是映射函数
你可以重写你的函数
def foo(bar: String): UIO[String] = {
for {
f <- UIO[String]("baz")
res <- foo(f)
} yield res
}
作为
def foo(bar: String): UIO[String] = {
UIO[String]("baz").flatMap(f =>
foo(f)
)
}
没有额外的.map
。
很明显,您的函数不是尾递归的。
如果您对堆栈安全感兴趣,可以使用scala.util.control.TailCalls
,cats.free.Trampoline
或cats.Monad#tailRecM
import cats.Monad
import zio.UIO
import zio.interop.catz.core._
Monad[UIO].tailRecM(??? /* starting value */)(a => ??? /* effectful calculation to be repeated until it returns Right */)
执行for时遇到了麻烦,但目前该问题已关闭。tailRecM
ZIO