这可能是一个愚蠢的问题,但从ZIO开始,我无法将Seq[ZIO]转换为ZIO[Seq]。
def translate(keys: Seq[String], locales: Seq[Locale]):RIO[Translator, Seq[Translation]] = {
for {
service <- ZIO.environment[Translator]
} yield {
// service.translate produce a zio.Task[Translation]
keys.map(k => service.translate(k, locales)
}
}要求:里约[翻译,SeqTranslation] 发现:齐奥[翻译,无事,塞克[zio.TaskTranslation]
我尝试了flatMap、flatten、collectAll和merge,但是我无法与任何人取得预期的结果。
如何将Seq[ZIO[_, _, B]]转换为ZIO[_, _, Seq[B]]?
谢谢
编辑:似乎是最好的选择,但是由于理解的原因,我仍然将它封装在另一个ZIO中。
发布于 2021-04-28 20:01:07
因为for循环转换为flatMap,除了最后一行是map,所以您希望在for -循环中添加foreach调用。
def translate(keys: Seq[String], locales: Seq[Locale]): RIO[Translator, Seq[Translation]] = {
for {
translator <- ZIO.environment[Translator]
translations <- ZIO.foreach(keys)(translator.translate(_, locales))
} yield translations
}发布于 2021-04-28 14:40:15
如果我对你说得对,你可以使用traverse函数从cats
import cats.instances.list._
import cats.syntax.traverse._
import zio.{RIO, Task, ZIO}
import zio.interop.catz._
import java.util.Locale
case class Translation()
trait Translator {
def translate(k: String, locales: Seq[Locale]): Task[Translation]
}
def translate(keys: Seq[String], locales: Seq[Locale]): RIO[Translator, Seq[Translation]] = {
val translator: Translator = ???
for {
service <- ZIO.effect(translator)
result <- keys.toList.traverse(k => service.translate(k, locales))
} yield result
}对于将List[ZIO[_, _, B]]映射到ZIO[_, _, List[B]],您可以使用sequence函数,我建议为此使用cats库。
import zio.ZIO
import zio.interop.catz._
import cats.syntax.traverse._
import cats.instances.list._
def ziosSequence[B](seqZIO: Seq[ZIO[Any, Throwable, B]]): ZIO[Any, Throwable, Seq[B]] =
seqZIO.toList.sequence.map(_.toSeq)sequence签名是:
def sequence[G[_]: Applicative, A](fga: F[G[A]]): G[F[A]] =
traverse(fga)(ga => ga)在这里,我们看到了什么功能,做我们需要的。它需要Applicative实例G (在您的情况下,G是ZIO ),而且我们也使用import zio.interop.catz._导入它,为了使列表能够调用sequence,我们需要为List导入Traverse实例:通过import cats.instances.list._不幸的操作,我们不能与Seq做相同的操作,因为我们需要d20例如sequence,并且我们应该将Seq转换为List前后来回转换sequence。
有用的链接:
发布于 2022-07-29 08:58:57
要“交换”列表和ZIO,您可以这样跳:
def dance(x: List[ZIO[Any,Throwable,Int]]): ZIO[Any, Throwable, List[Int]] =
x.map ( a => a.map(x=> List(x)))
.fold ( ZIO.succeed( List[Int]()) )
((x, y) => x.map(a => y.map(b => a ++ b ) )
.flatten
)https://stackoverflow.com/questions/67301065
复制相似问题