首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zio,将Seq[ZIO]转换为ZIO[Seq]

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

Stack Overflow用户
提问于 2021-04-28 13:20:18
回答 3查看 1.1K关注 0票数 3

这可能是一个愚蠢的问题,但从ZIO开始,我无法将Seq[ZIO]转换为ZIO[Seq]

代码语言:javascript
复制
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]

我尝试了flatMapflattencollectAllmerge,但是我无法与任何人取得预期的结果。

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

谢谢

编辑:似乎是最好的选择,但是由于理解的原因,我仍然将它封装在另一个ZIO中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-04-28 20:01:07

因为for循环转换为flatMap,除了最后一行是map,所以您希望在for -循环中添加foreach调用。

代码语言:javascript
复制
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
}
票数 10
EN

Stack Overflow用户

发布于 2021-04-28 14:40:15

如果我对你说得对,你可以使用traverse函数从cats

代码语言:javascript
复制
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库。

代码语言:javascript
复制
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签名是:

代码语言:javascript
复制
def sequence[G[_]: Applicative, A](fga: F[G[A]]): G[F[A]] =
  traverse(fga)(ga => ga)

在这里,我们看到了什么功能,做我们需要的。它需要Applicative实例G (在您的情况下,GZIO ),而且我们也使用import zio.interop.catz._导入它,为了使列表能够调用sequence,我们需要为List导入Traverse实例:通过import cats.instances.list._不幸的操作,我们不能与Seq做相同的操作,因为我们需要d20例如sequence,并且我们应该将Seq转换为List前后来回转换sequence。

有用的链接:

票数 0
EN

Stack Overflow用户

发布于 2022-07-29 08:58:57

要“交换”列表和ZIO,您可以这样跳:

代码语言:javascript
复制
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 
        )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67301065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档