Scala-如何在foreach理解块中使用foreach循环?

我有一个简单的代码:

 override def createContributorsList(url: String,params: String): F[List[Contributor]] = getcontributorsFromClient(url,params).fold[List[Contributor]](_ => List(),res => res)

 override def createReposList(organization: String,params: String): F[List[GitRepository]] = getReposFromClient(organization,params).fold[List[GitRepository]](_ => List(),res => res)

此代码从github返回存储库列表和贡献列表。但是现在我需要为createContributorsList找到的每个存储库调用createReposList。我已经完成了一个for comprehension块:

val stats = new StatisticsRepository[IO](new GitHttpClient[IO])
val res = for {
    repos <- stats.createReposList("github","")
  } yield repos

它工作正常,它找到了给定组织(github)的存储库。所以我尝试这样做:

val res = for {
    repos <- stats.createReposList("github","")
    list = repos.foreach(repo => stats.createContributorsList(repo.contributors_url,""))
  } yield (repos,list)

但是list始终为空。我不知道如果没有for comprehension怎么办,因为我在Monads上像IO一样进行操作。我应该如何创建代码来遍历repos的每个回购并在所有人身上调用stats.createContributorsList

jsjloveqx 回答:Scala-如何在foreach理解块中使用foreach循环?

尝试flatTraverse

import cats.syntax.flatMap._
import cats.syntax.functor._
import cats.syntax.traverse._
import cats.instances.list._

val res: F[(List[GitRepository],List[Contributor])] = for {
  repos <- stats.createReposList("github","")
  list <- repos.flatTraverse(repo => stats.createContributorsList(repo.contributors_url,""))
} yield (repos,list)

foreach返回Unit,所以这不是您所需要的。

本文链接:https://www.f2er.com/3127517.html

大家都在问