Zio,将 Seq[ZIO] 转换为 ZIO[Seq]

ger*_*s.b 3 scala zio

这可能是一个愚蠢的问题,但从 ZIO 开始,我无法设法将 a 转换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)
  }
}
Run Code Online (Sandbox Code Playgroud)

必需:RIO[翻译器,Seq[翻译]]

找到:ZIO[翻译器,无,Seq[zio.Task[翻译]]

我尝试过,flatMap但是flatten我无法与任何人取得预期的结果。collectAllmerge

如何将 a 转换Seq[ZIO[_, _, B]]为 a ZIO[_, _, Seq[B]]

谢谢

编辑:这似乎ZIO.foreach是最好的选择,但是由于 for 理解,我仍然将它包裹在另一个 ZIO 中。

fra*_*isr 10

因为 for 循环会转换为flatMap除了最后一行 a 之外的内容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
}
Run Code Online (Sandbox Code Playgroud)