2

例如:

def foo(bar: String): UIO[String] = {
    for {
      f <- UIO("baz")
      res <- foo(f)
    } yield res
  }

似乎不可能,因为最后一行是映射函数

4

1 回答 1

1

你可以重写你的函数

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.TailCallscats.free.Trampolinecats.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时遇到了麻烦,但目前该问题已关闭。tailRecMZIO

于 2020-07-12T14:56:14.077 回答